/ Hex Artifact Content
Login

Artifact 187fad4d385b3b26ec6fd4b703b1b087ad6a5c4d:


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 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64  or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57  ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73  AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68   several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61  at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64  vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61  ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51  rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26  LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72  _OMIT_WAL).#  er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65  ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66  quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69  NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45  le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64  _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
06c0: 74 68 65 20 72 65 71 75 69 72 65 64 20 57 69 6e  the required Win
06d0: 64 6f 77 73 20 53 44 4b 20 76 65 72 73 69 6f 6e  dows SDK version
06e0: 20 63 6f 6e 73 74 61 6e 74 73 20 69 66 20 74 68   constants if th
06f0: 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c  ey are not.** al
0700: 72 65 61 64 79 20 61 76 61 69 6c 61 62 6c 65 2e  ready available.
0710: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 54 44 44  .*/.#ifndef NTDD
0720: 49 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65  I_WIN8.#  define
0730: 20 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20   NTDDI_WIN8     
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65     0x06020000.#e
0760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54  ndif..#ifndef NT
0770: 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 64  DDI_WINBLUE.#  d
0780: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 42  efine NTDDI_WINB
0790: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
07a0: 20 20 20 20 20 20 20 20 30 78 30 36 30 33 30 30          0x060300
07b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  00.#endif../*.**
07c0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 47 65   Check if the Ge
07d0: 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66  tVersionEx[AW] f
07e0: 75 6e 63 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  unctions should 
07f0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64 65  be considered de
0800: 70 72 65 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20  precated.** and 
0810: 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 6d  avoid using them
0820: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
0830: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74  It should be not
0840: 65 64 20 68 65 72 65 20 74 68 61 74 20 69 66 20  ed here that if 
0850: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
0860: 74 68 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  the SQLITE_WIN32
0870: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 70 72  _GETVERSIONEX pr
0880: 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
0890: 6f 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 77 68  o is zero.** (wh
08a0: 65 74 68 65 72 20 76 69 61 20 74 68 69 73 20 62  ether via this b
08b0: 6c 6f 63 6b 20 6f 72 20 76 69 61 20 62 65 69 6e  lock or via bein
08c0: 67 20 6d 61 6e 75 61 6c 6c 79 20 73 70 65 63 69  g manually speci
08d0: 66 69 65 64 29 2c 20 74 68 61 74 20 69 6d 70 6c  fied), that impl
08e0: 69 65 73 0a 2a 2a 20 74 68 65 20 75 6e 64 65 72  ies.** the under
08f0: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
0900: 73 79 73 74 65 6d 20 77 69 6c 6c 20 61 6c 77 61  system will alwa
0910: 79 73 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ys be based on t
0920: 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a  he Windows NT.**
0930: 20 4b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e   Kernel..*/.#ifn
0940: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
0950: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
0960: 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44   if defined(NTDD
0970: 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54  I_VERSION) && NT
0980: 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e  DDI_VERSION >= N
0990: 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20  TDDI_WINBLUE.#  
09a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
09b0: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
09c0: 45 58 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  EX   0.#  else.#
09d0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
09e0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
09f0: 4f 4e 45 58 20 20 20 31 0a 23 20 20 65 6e 64 69  ONEX   1.#  endi
0a00: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0a10: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0a20: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0a30: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0a40: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0a50: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
0a60: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
0a70: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
0aa0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
0ab0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0ac0: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0ad0: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0ae0: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0af0: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0b00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0b10: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0b20: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0b30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0b40: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0b50: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0b60: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0b70: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0b80: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0b90: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ba0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0bb0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0bc0: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0bd0: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0be0: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0bf0: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0c00: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0c10: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0c20: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0c30: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0c40: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0c50: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0c60: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0c80: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0c90: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0cb0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0cc0: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0cd0: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0ce0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0cf0: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0d00: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0d10: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0d20: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0d30: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0d40: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0d50: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0d60: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0d70: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0d80: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0d90: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0da0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0db0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0dc0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0dd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0de0: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0df0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0e00: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0e10: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0e20: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0e30: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0e40: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0e50: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0e60: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0e70: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0e80: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0ea0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0eb0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0ec0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0ed0: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_BYTES   \.   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
0f00: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0f10: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0f20: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0f30: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0f40: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0f50: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0f60: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0f70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0f80: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0f90: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0fa0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0fb0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0fd0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0fe0: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0ff0: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
1000: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
1010: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
1020: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
1030: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1040: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1060: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
1070: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1090: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
10a0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
10b0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
10c0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
10d0: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
10e0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
10f0: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1100: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1110: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1120: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1130: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1140: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1150: 45 5f 56 41 4c 55 45 28 78 29 20 28 76 6f 69 64  E_VALUE(x) (void
1160: 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )(x).#endif../*.
1170: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
1180: 68 61 72 61 63 74 65 72 20 74 68 61 74 20 73 68  haracter that sh
1190: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
11a0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
11b0: 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  parator..*/.#ifn
11c0: 64 65 66 20 77 69 6e 47 65 74 44 69 72 53 65 70  def winGetDirSep
11d0: 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65  .#  define winGe
11e0: 74 44 69 72 53 65 70 28 29 20 20 20 20 20 20 20  tDirSep()       
11f0: 20 20 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65           '\\'.#e
1200: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77  ndif../*.** Do w
1210: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c  e need to manual
1220: 6c 79 20 64 65 66 69 6e 65 20 74 68 65 20 57 69  ly define the Wi
1230: 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  n32 file mapping
1240: 20 41 50 49 73 20 66 6f 72 20 75 73 65 20 77 69   APIs for use wi
1250: 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28  th WAL.** mode (
1260: 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73 20  e.g. these APIs 
1270: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  are available in
1280: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 43 45 20   the Windows CE 
1290: 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74 68  SDK; however, th
12a0: 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 70 72  ey.** are not pr
12b0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65 61  esent in the hea
12c0: 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69  der file)?.*/.#i
12d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  f SQLITE_WIN32_F
12e0: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
12f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1300: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a  E_OMIT_WAL)./*.*
1310: 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 66 69 6c  * Two of the fil
1320: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 61  e mapping APIs a
1330: 72 65 20 64 69 66 66 65 72 65 6e 74 20 75 6e 64  re different und
1340: 65 72 20 57 69 6e 52 54 2e 20 20 46 69 67 75 72  er WinRT.  Figur
1350: 65 20 6f 75 74 20 77 68 69 63 68 0a 2a 2a 20 73  e out which.** s
1360: 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23  et we need..*/.#
1370: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1380: 52 54 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41  RT.WINBASEAPI HA
1390: 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61  NDLE WINAPI Crea
13a0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
13b0: 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  mApp(HANDLE, \. 
13c0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
13d0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 55 4c  Y_ATTRIBUTES, UL
13e0: 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 4c 50  ONG, ULONG64, LP
13f0: 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 41 53 45  CWSTR);..WINBASE
1400: 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50  API LPVOID WINAP
1410: 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  I MapViewOfFileF
1420: 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 55  romApp(HANDLE, U
1430: 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 53  LONG, ULONG64, S
1440: 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23 69  IZE_T);.#else.#i
1450: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1470: 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44  .WINBASEAPI HAND
1480: 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65  LE WINAPI Create
1490: 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 48 41 4e  FileMappingA(HAN
14a0: 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f  DLE, LPSECURITY_
14b0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
14c0: 20 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f        DWORD, DWO
14d0: 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 53 54  RD, DWORD, LPCST
14e0: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
14f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1500: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 2a 2f 0a  32_HAS_ANSI) */.
1510: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1520: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1530: 44 45 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  DE).WINBASEAPI H
1540: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
1550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1560: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
1570: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
1580: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
1590: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
15a0: 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f  CWSTR);.#endif /
15b0: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
15c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
15d0: 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 50 49 20   */..WINBASEAPI 
15e0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
15f0: 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e 44  pViewOfFile(HAND
1600: 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  LE, DWORD, DWORD
1610: 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54 29  , DWORD, SIZE_T)
1620: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1630: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
1640: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
1650: 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20 63  mapping API is c
1660: 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69  ommon to both Wi
1670: 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a  n32 and WinRT..*
1680: 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f  /.WINBASEAPI BOO
1690: 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56 69  L WINAPI UnmapVi
16a0: 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44  ewOfFile(LPCVOID
16b0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16c0: 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41  ITE_WIN32_FILEMA
16d0: 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65  PPING_API && !de
16e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16f0: 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_WAL) */../*.**
1700: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
1710: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
1720: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
1730: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
1740: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1750: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
1760: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1770: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
1780: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1790: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
17a0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
17b0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
17c0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
17d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17e0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
17f0: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
1800: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
1810: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
1820: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1840: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1850: 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63 74 75  ences to structu
1860: 72 65 73 20 75 73 65 64 20 66 6f 72 20 57 41 4c  res used for WAL
1870: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1880: 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d  ct winShm winShm
1890: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
18b0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
18c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
18d0: 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d  inShmNode winShm
18e0: 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67  Node;   /* A reg
18f0: 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ion of shared-me
1900: 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  mory */.#endif..
1910: 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b  /*.** WinCE lack
1920: 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74  s native support
1930: 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   for file lockin
1940: 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  g so we have to 
1950: 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  fake it.** with 
1960: 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72  some code of our
1970: 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   own..*/.#if SQL
1980: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70  ITE_OS_WINCE.typ
1990: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
19a0: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
19b0: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
19c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
19d0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
19e0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
19f0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
1a00: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
1a10: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1a20: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1a30: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
1a40: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1a50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
1a60: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
1a70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
1a80: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
1a90: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
1aa0: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
1ab0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
1ac0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
1ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
1ae0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1af0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
1b00: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
1b10: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
1b20: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
1b30: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
1b40: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
1b50: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
1b60: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
1b70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b80: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
1b90: 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66  ; /*** Must be f
1ba0: 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69  irst ***/.  sqli
1bb0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1bc0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75      /* The VFS u
1bd0: 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73  sed to open this
1be0: 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c   file */.  HANDL
1bf0: 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  E h;            
1c00: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
1c10: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 66   accessing the f
1c20: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b  ile */.  u8 lock
1c30: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
1c40: 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
1c50: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1c60: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1c70: 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f    short sharedLo
1c80: 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e  ckByte;   /* Ran
1c90: 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74  domly chosen byt
1ca0: 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61 72  e used as a shar
1cb0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  ed lock */.  u8 
1cc0: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1cd0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20       /* Flags.  
1ce0: 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65  See WINFILE_* be
1cf0: 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  low */.  DWORD l
1d00: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1d10: 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1d20: 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1d30: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1d40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d50: 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68  OMIT_WAL.  winSh
1d60: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1d70: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
1d80: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
1d90: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1da0: 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63  #endif.  const c
1db0: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1dc0: 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d   /* Full pathnam
1dd0: 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a  e of this file *
1de0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e00: 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67  hunk size config
1e10: 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48  ured by FCNTL_CH
1e20: 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20  UNK_SIZE */.#if 
1e30: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1e40: 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65    LPWSTR zDelete
1e50: 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d  OnClose;  /* Nam
1e60: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
1e70: 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  ete when closing
1e80: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75   */.  HANDLE hMu
1e90: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tex;          /*
1ea0: 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20 63   Mutex used to c
1eb0: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
1ec0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20   shared lock */ 
1ed0: 20 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72   .  HANDLE hShar
1ee0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ed;         /* S
1ef0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
1f00: 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f  ment used for lo
1f10: 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  cking */.  wince
1f20: 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20  Lock local;     
1f30: 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61     /* Locks obta
1f40: 69 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e 73  ined by this ins
1f50: 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65  tance of winFile
1f60: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f70: 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a  *shared;      /*
1f80: 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c   Global shared l
1f90: 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ock memory for t
1fa0: 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64  he file  */.#end
1fb0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
1fc0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1fd0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
2000: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
2010: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41  ferences */.  HA
2020: 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2040: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
2050: 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  ing memory mappi
2060: 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ng */.  void *pM
2070: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
2080: 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65        /* Area me
2090: 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
20a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
20b0: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  mapSize;       /
20c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
20d0: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
20e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
20f0: 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  4 mmapSizeActual
2100: 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65  ; /* Actual size
2110: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
2120: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
2130: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
2140: 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
2150: 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  ed FCNTL_MMAP_SI
2160: 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  ZE value */.#end
2170: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
2180: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2190: 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  winFile.ctrlFlag
21a0: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  s.*/.#define WIN
21b0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
21c0: 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43       0x02   /* C
21d0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
21e0: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
21f0: 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  e WINFILE_PERSIS
2200: 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20 20  T_WAL     0x04  
2210: 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57   /* Persistent W
2220: 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69  AL mode */.#defi
2230: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20  ne WINFILE_PSOW 
2240: 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30 20             0x10 
2250: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
2260: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
2270: 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  WRITE */../*. * 
2280: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
2290: 62 75 66 66 65 72 20 75 73 65 64 20 62 79 20 73  buffer used by s
22a0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
22b0: 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a  te_debug().. */.
22c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
22d0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
22e0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
22f0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
2300: 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34  _SIZE   ((int)(4
2310: 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44  096-sizeof(DWORD
2320: 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  ))).#endif../*. 
2330: 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65 64  * The value used
2340: 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69   with sqlite3_wi
2350: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
2360: 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74  y() to specify t
2370: 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20  hat. * the data 
2380: 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64  directory should
2390: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f   be changed.. */
23a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23b0: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
23c0: 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66  TORY_TYPE.#  def
23d0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
23e0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
23f0: 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a  TYPE (1).#endif.
2400: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
2410: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
2420: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
2430: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
2440: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
2450: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
2460: 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68  ory should be ch
2470: 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64  anged.. */.#ifnd
2480: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2490: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
24a0: 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  YPE.#  define SQ
24b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
24c0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28  DIRECTORY_TYPE (
24d0: 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  2).#endif../*. *
24e0: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
24f0: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
2500: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
2510: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
2520: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
2530: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
2540: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
2550: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
2560: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
2570: 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20  2_MALLOC../*. * 
2580: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a  If this is non-z
2590: 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64  ero, an isolated
25a0: 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72   heap will be cr
25b0: 65 61 74 65 64 20 62 79 20 74 68 65 20 6e 61 74  eated by the nat
25c0: 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c  ive Win32. * all
25d0: 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d  ocator subsystem
25e0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65  ; otherwise, the
25f0: 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73   default process
2600: 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73   heap will be us
2610: 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74  ed.  This. * set
2620: 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65  ting has no effe
2630: 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ct when compilin
2640: 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79  g for WinRT.  By
2650: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69   default, this i
2660: 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64  s enabled. * and
2670: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
2680: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
2690: 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61  d to store all a
26a0: 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20  llocated data.. 
26b0: 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *. *************
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2700: 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74  *. * WARNING: It
2710: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2720: 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   note that when 
2730: 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 73 20  this setting is 
2740: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
2750: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e  . *          win
2760: 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63  MemShutdown func
2770: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
2780: 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69  e.g. by the sqli
2790: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20  te3_shutdown. * 
27a0: 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f           functio
27b0: 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61  n), all data tha
27c0: 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  t was allocated 
27d0: 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74  using the isolat
27e0: 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20  ed heap will. * 
27f0: 20 20 20 20 20 20 20 20 20 62 65 20 66 72 65 65           be free
2800: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e  d immediately an
2810: 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  d any attempt to
2820: 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74   access any of t
2830: 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20  hat freed. *    
2840: 20 20 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20        data will 
2850: 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
2860: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d   result in an im
2870: 6d 65 64 69 61 74 65 20 61 63 63 65 73 73 20 76  mediate access v
2880: 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a  iolation.. *****
2890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69  *********. */.#i
28e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
28f0: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23  32_HEAP_CREATE.#
2900: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2910: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
2920: 45 20 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64  E    (TRUE).#end
2930: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e  if../*. * The in
2940: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
2950: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2960: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
2970: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
2980: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2990: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
29a0: 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  IT_SIZE.#  defin
29b0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
29c0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28  EAP_INIT_SIZE ((
29d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
29e0: 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20  ACHE_SIZE) * \. 
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45        (SQLITE_DE
2a20: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2a30: 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64   + 4194304).#end
2a40: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61  if../*. * The ma
2a50: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68  ximum size of th
2a60: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2a70: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
2a80: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
2a90: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2aa0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
2ab0: 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  X_SIZE.#  define
2ac0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2ad0: 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29  AP_MAX_SIZE  (0)
2ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2af0: 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 74  he extra flags t
2b00: 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74  o use in calls t
2b10: 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61 70  o the Win32 heap
2b20: 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c   APIs.  This val
2b30: 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72  ue may be. * zer
2b40: 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  o for the defaul
2b50: 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a  t behavior.. */.
2b60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2b70: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a  IN32_HEAP_FLAGS.
2b80: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2b90: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2ba0: 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66  S     (0).#endif
2bb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  .../*.** The win
2bc0: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
2bd0: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
2be0: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
2bf0: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
2c00: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
2c10: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
2c20: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
2c30: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
2c40: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
2c50: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
2c60: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
2c70: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
2c80: 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic1;   /* Magic 
2c90: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
2ca0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
2cb0: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
2cc0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
2cd0: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
2ce0: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
2cf0: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
2d00: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
2d10: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
2d20: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
2d30: 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  n)? */.#ifndef N
2d40: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
2d50: 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c2;   /* Magic n
2d60: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
2d70: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
2d80: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
2d90: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
2da0: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
2db0: 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30 78 34  M_MAGIC1     0x4
2dc0: 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20  2b2830b.#define 
2dd0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20  WINMEM_MAGIC2   
2de0: 20 20 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e    0xbd4d7cf4.#en
2df0: 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75  dif..static stru
2e00: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
2e10: 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23  n_mem_data = {.#
2e20: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2e30: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23  WINMEM_MAGIC1,.#
2e40: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
2e50: 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  LSE.#ifndef NDEB
2e60: 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47  UG.  ,WINMEM_MAG
2e70: 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23  IC2.#endif.};..#
2e80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
2e90: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2ea0: 72 74 4d 61 67 69 63 31 28 29 20 61 73 73 65 72  rtMagic1() asser
2eb0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
2ec0: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
2ed0: 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20  AGIC1 ).#define 
2ee0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2ef0: 63 32 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c2() assert( win
2f00: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32  _mem_data.magic2
2f10: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
2f20: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
2f30: 41 73 73 65 72 74 4d 61 67 69 63 28 29 20 20 77  AssertMagic()  w
2f40: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2f50: 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72  1(); winMemAsser
2f60: 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65  tMagic2();.#else
2f70: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
2f80: 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e  ssertMagic().#en
2f90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e  dif..#define win
2fa0: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 20  MemGetDataPtr() 
2fb0: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23   &win_mem_data.#
2fc0: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
2fd0: 48 65 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d  Heap()     win_m
2fe0: 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64  em_data.hHeap.#d
2ff0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f  efine winMemGetO
3000: 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65  wned()    win_me
3010: 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73  m_data.bOwned..s
3020: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
3030: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
3040: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  tes);.static voi
3050: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
3060: 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74  d *pPrior);.stat
3070: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
3080: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
3090: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
30a0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
30b0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
30c0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
30d0: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
30e0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
30f0: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
3100: 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63  AppData);.static
3110: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
3120: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
3130: 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c  ata);..const sql
3140: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3150: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
3160: 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64  in32(void);.#end
3170: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
3180: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
3190: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
31a0: 67 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e  g variable is (n
31b0: 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63  ormally) set onc
31c0: 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e  e and never chan
31d0: 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65  ges.** thereafte
31e0: 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77  r.  It records w
31f0: 68 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61  hether the opera
3200: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3210: 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54  in9x.** or WinNT
3220: 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65  ..**.** 0:   Ope
3230: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e  rating system un
3240: 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f  known..** 1:   O
3250: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3260: 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20  is Win9x..** 2: 
3270: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
3280: 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  em is WinNT..**.
3290: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66  ** In order to f
32a0: 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e  acilitate testin
32b0: 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73  g on a WinNT sys
32c0: 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69  tem, the test fi
32d0: 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e  xture.** can man
32e0: 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76  ually set this v
32f0: 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75  alue to 1 to emu
3300: 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76  late Win98 behav
3310: 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ior..*/.#ifdef S
3320: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
3330: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
3340: 20 30 3b 0a 23 65 6c 69 66 20 21 53 51 4c 49 54   0;.#elif !SQLIT
3350: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3370: 26 20 5c 0a 20 20 20 20 20 20 64 65 66 69 6e 65  & \.      define
3380: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3390: 41 53 5f 41 4e 53 49 29 20 26 26 20 64 65 66 69  AS_ANSI) && defi
33a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
33b0: 5f 48 41 53 5f 57 49 44 45 29 0a 73 74 61 74 69  _HAS_WIDE).stati
33c0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  c int sqlite3_os
33d0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69  _type = 0;.#endi
33e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41  f..#ifndef SYSCA
33f0: 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53  LL.#  define SYS
3400: 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73  CALL sqlite3_sys
3410: 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a  call_ptr.#endif.
3420: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3430: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69  tion is not avai
3440: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
3450: 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a   CE or WinRT.. *
3460: 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  /..#if SQLITE_OS
3470: 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
3480: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66  _OS_WINRT.#  def
3490: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
34a0: 73 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a  sANSI()       1.
34b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
34c0: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
34d0: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
34e0: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
34f0: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
3500: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
3510: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
3520: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
3530: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
3540: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
3550: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
3560: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
3570: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
3580: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
3590: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
35a0: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
35b0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
35c0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
35d0: 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63  in_syscall {.  c
35e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3600: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74  Name of the syst
3610: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
3640: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
3650: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
3660: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3670: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
3680: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
3690: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
36a0: 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49  [] = {.#if !SQLI
36b0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
36c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
36d0: 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73    { "AreFileApis
36e0: 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28  ANSI",         (
36f0: 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41  SYSCALL)AreFileA
3700: 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20  pisANSI,        
3710: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3720: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
3730: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3740: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3760: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
3770: 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  f osAreFileApisA
3780: 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72  NSI.#define osAr
3790: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28  eFileApisANSI ((
37a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f  BOOL(WINAPI*)(VO
37b0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  ID))aSyscall[0].
37c0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
37d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
37e0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
37f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3800: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
3810: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
3820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3830: 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20  CharLowerW,     
3840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3850: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  lse.  { "CharLow
3860: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3870: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
38a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
38b0: 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28  LowerW ((LPWSTR(
38c0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
38d0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
38e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
38f0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
3900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3910: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3920: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3940: 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57  SCALL)CharUpperW
3950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
3960: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3970: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
3980: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3990: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
39a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
39b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
39c0: 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c  osCharUpperW ((L
39d0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
39e0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
39f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3a00: 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c  { "CloseHandle",
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3a20: 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c  SCALL)CloseHandl
3a30: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
3a40: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43   },..#define osC
3a50: 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f  loseHandle ((BOO
3a60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
3a70: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  E))aSyscall[3].p
3a80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3a90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3aa0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3ab0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3ad0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41  CALL)CreateFileA
3ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3af0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3b00: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3b10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3b20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3b30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3b50: 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48  sCreateFileA ((H
3b60: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3b70: 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  PCSTR,DWORD,DWOR
3b80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
3b90: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3ba0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
3bb0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
3bc0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
3bd0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3be0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3bf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3c00: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
3c10: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
3c20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3c30: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  ateFileW,       
3c40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3c50: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3c60: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3c70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3ca0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3cb0: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ileW ((HANDLE(WI
3cc0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
3cd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
3ce0: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
3cf0: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
3d00: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
3d10: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
3d20: 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c  rent)..#if (!SQL
3d30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
3d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3d50: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
3d60: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
3d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3d80: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
3d90: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
3da0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3db0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3dc0: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
3dd0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
3de0: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3df0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3e20: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
3e30: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28  eFileMappingA ((
3e40: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
3e50: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
3e60: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
3e70: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
3e80: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  ORD,DWORD,LPCSTR
3e90: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
3ea0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3eb0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
3ec0: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
3ed0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3ee0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3ef0: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
3f00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3f10: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
3f20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3f30: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
3f40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3f50: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
3f60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3f70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3fa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3fb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3fc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3fd0: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
3fe0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3ff0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4000: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
4010: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
4020: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4030: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
4040: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4050: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4070: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4080: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
40a0: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
40b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40c0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
40d0: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
40e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4110: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
4120: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
4130: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
4140: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
4150: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
4160: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4170: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4180: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
41a0: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
41b0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
41c0: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
41d0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
41e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
41f0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4240: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4250: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4260: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4270: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4290: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
42a0: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
42b0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
42c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
42d0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
42e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
42f0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4310: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4340: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4350: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4360: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4370: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4380: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4390: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
43a0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
43b0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
43c0: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
43d0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
43e0: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
43f0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4400: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4430: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4440: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4450: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4460: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4470: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4480: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4490: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
44a0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
44b0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
44c0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
44d0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
44e0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
44f0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4500: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4510: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4520: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4560: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4570: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4580: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4590: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
45a0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
45b0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
45c0: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
45d0: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
45e0: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
45f0: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4600: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4610: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4620: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4630: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4640: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4650: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4660: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4670: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4680: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
46a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
46c0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
46d0: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
46e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4710: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4720: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4730: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4740: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4750: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4760: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4770: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4780: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4790: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
47a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
47b0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
47c0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
47d0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
47e0: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
47f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4800: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4810: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4820: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4840: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4850: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
4860: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
4870: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
4880: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
4890: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
48a0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
48b0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
48c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
48d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
48e0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
48f0: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
4900: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
4910: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
4920: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
4930: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4940: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
49a0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
49b0: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
49c0: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
49d0: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
49e0: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
49f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
4a00: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
4a10: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4a20: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
4a30: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4a50: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
4a60: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4a70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4a80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4a90: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4aa0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
4ab0: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
4ac0: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
4ad0: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
4ae0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4af0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b00: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4b10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4b40: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
4b50: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
4b60: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
4b70: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
4b80: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4b90: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4ba0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
4bb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4bc0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4bd0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4be0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4bf0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4c00: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c10: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4c20: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4c30: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
4c40: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4c50: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ca0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
4cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4cc0: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
4cd0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4cf0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
4d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4d20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4d30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d40: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
4d50: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4d60: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
4d70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4d80: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d90: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4da0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4dd0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4de0: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
4df0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4e00: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
4e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4e20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4e40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4e50: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4e60: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
4e70: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4e80: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
4e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4ea0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4eb0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4ef0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4f00: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
4f10: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4f20: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
4f30: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4f40: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4f50: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4f60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f70: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
4f80: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4f90: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
4fa0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4fb0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4fc0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ff0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5000: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
5010: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
5020: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
5030: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
5040: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
5050: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
5060: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5070: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5080: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5090: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
50a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
50b0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
50c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
50d0: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
50f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5120: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
5130: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
5140: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
5150: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
5160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5170: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5180: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
51a0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
51b0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
51c0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
51d0: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
51e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51f0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5200: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5240: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5250: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5260: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5270: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5280: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5290: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
52a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
52c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
52d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
52e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
52f0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5300: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5310: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5320: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5340: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5350: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5390: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
53a0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
53b0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
53c0: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
53d0: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
53e0: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
53f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5400: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5410: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5420: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5440: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5450: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5460: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5470: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5480: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5490: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
54a0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
54b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
54c0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
54d0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
54e0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
54f0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5500: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5510: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5520: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5530: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5540: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5550: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5560: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5570: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5580: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5590: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
55a0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
55b0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
55c0: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
55d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
55e0: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
55f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5600: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5620: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5630: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5670: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5680: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5690: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
56a0: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
56b0: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
56c0: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
56d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
56e0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
56f0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5700: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5710: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5720: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5730: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5740: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5750: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5780: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5790: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
57a0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
57b0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
57c0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
57d0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
57e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
57f0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
5800: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
5810: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5820: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
5830: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
5840: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
5850: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
5860: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5870: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
5880: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5890: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
58a0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
58b0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
58d0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
58e0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5920: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5930: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
5940: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5950: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
5960: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
5970: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5990: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
59a0: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
59b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
59c0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
59d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
59e0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
59f0: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5a30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5a40: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
5a50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5a60: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
5a70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5a80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5a90: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5aa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5ab0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
5ac0: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
5ad0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5ae0: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
5af0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5b00: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5b10: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5b20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5b50: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
5b60: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
5b70: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
5b80: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ba0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5bb0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
5bc0: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
5bd0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
5be0: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
5bf0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5c00: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5c20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5c40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5c50: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
5c60: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
5c70: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
5c80: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
5c90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
5cb0: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
5cc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5cd0: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a  VERSIONEX) && \.
5ce0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
5cf0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d00: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d10: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
5d20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d30: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
5d40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5d50: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5d90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5da0: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5db0: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
5dc0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5dd0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
5de0: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
5df0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5e10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5e20: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
5e30: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66  && \.        def
5e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e50: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5e60: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
5e70: 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b  GETVERSIONEX.  {
5e80: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
5e90: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5ea0: 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45  CALL)GetVersionE
5eb0: 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  xW,           0 
5ec0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5ed0: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5ee0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5f00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f10: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f20: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28  sGetVersionExW (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45  \.        LPOSVE
5f50: 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73  RSIONINFOW))aSys
5f60: 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e  call[35].pCurren
5f70: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c  t)..  { "HeapAll
5f80: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
5f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5fa0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
5fb0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5fc0: 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28  ne osHeapAlloc (
5fd0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
5fe0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5ff0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6000: 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43  )aSyscall[36].pC
6010: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6020: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6030: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6050: 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65  SCALL)HeapCreate
6060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6080: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6090: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
60a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
60b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
60c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
60d0: 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48  osHeapCreate ((H
60e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44  ANDLE(WINAPI*)(D
60f0: 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20  WORD,SIZE_T, \. 
6100: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6110: 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72  Syscall[37].pCur
6120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6140: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6160: 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c  ALL)HeapDestroy,
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
6190: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
61a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61e0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f  HeapDestroy ((BO
61f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6200: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  LE))aSyscall[38]
6210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6220: 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20  "HeapFree",     
6230: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6240: 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20  ALL)HeapFree,   
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6260: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6270: 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e  pFree ((BOOL(WIN
6280: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6290: 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63  RD,LPVOID))aSysc
62a0: 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74  all[39].pCurrent
62b0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c  )..  { "HeapReAl
62c0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
62d0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52    (SYSCALL)HeapR
62e0: 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  eAlloc,         
62f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6300: 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20  e osHeapReAlloc 
6310: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6320: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6330: 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20  PVOID, \.       
6340: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6350: 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[40].pCurrent).
6360: 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c  .  { "HeapSize",
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a  (SYSCALL)HeapSiz
6390: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
63a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
63b0: 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a  osHeapSize ((SIZ
63c0: 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  E_T(WINAPI*)(HAN
63d0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
63e0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
63f0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
6400: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6410: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6420: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6430: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6440: 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c  LL)HeapValidate,
6450: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6460: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6470: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6480: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
64b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
64c0: 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f  eapValidate ((BO
64d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
64e0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
64f0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6500: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
6510: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6520: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6540: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6560: 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63  SCALL)HeapCompac
6570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  t,             0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6590: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28  osHeapCompact ((
65f0: 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41  UINT(WINAPI*)(HA
6600: 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73  NDLE,DWORD))aSys
6610: 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e  call[43].pCurren
6620: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6640: 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e  _ANSI) && !defin
6650: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
6660: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
6670: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6690: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
66a0: 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryA,            
66b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6710: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20   osLoadLibraryA 
6720: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
6730: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
6740: 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74  all[44].pCurrent
6750: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6760: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6770: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6780: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6790: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
67a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
67b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
67c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
67d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
67f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6810: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6860: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
6870: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6880: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
6890: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
68c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
68d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
68e0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
68f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6900: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
6910: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6950: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
6960: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
6970: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
6980: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
6990: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
69b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
69c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
69e0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a10: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6a20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6a60: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
6a70: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
6a80: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6a90: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6aa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6ab0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6ac0: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
6ad0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
6ae0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
6af0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b10: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6b30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6b40: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6b50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6b70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6b90: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
6ba0: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
6bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6bd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6be0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
6bf0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6c00: 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[48].pCurrent)
6c10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
6c20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
6c30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
6c40: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
6c50: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
6c60: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
6c70: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
6c80: 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f  SYSCALL)MapViewO
6c90: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
6ca0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6cb0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
6cc0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6cd0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6cf0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6d00: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
6d10: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
6d20: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6d30: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6d40: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
6d50: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
6d60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
6d70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
6d80: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6d90: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
6da0: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
6db0: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
6dc0: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
6dd0: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
6de0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
6df0: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
6e00: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
6e10: 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[50].pCurrent).
6e20: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
6e30: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
6e40: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
6e50: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
6e60: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
6e70: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
6e80: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
6e90: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
6ea0: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
6eb0: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  ER*))aSyscall[51
6ec0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6ed0: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6ef0: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6f10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
6f20: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
6f30: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
6f40: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
6f50: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6f60: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
6f70: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
6f80: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
6f90: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
6fb0: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
6fc0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6fd0: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
6fe0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6ff0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
7000: 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[53].pCurrent)
7010: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7020: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46  _WINRT.  { "SetF
7030: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
7040: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
7050: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
7060: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7070: 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  se.  { "SetFileP
7080: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
7090: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
70c0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69  .#define osSetFi
70d0: 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52  lePointer ((DWOR
70e0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
70f0: 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a  E,LONG,PLONG, \.
7100: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
7110: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
7120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7140: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
7150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7160: 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20  ALL)Sleep,      
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65  ,.#else.  { "Sle
7190: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
71a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
71b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
71c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
71d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
71e0: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
71f0: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
7200: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
7210: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
7220: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
7230: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
7240: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
7250: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
7260: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
7270: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
7280: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
7290: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
72a0: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
72b0: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d  ME))aSyscall[56]
72c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
72d0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
72e0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
72f0: 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INRT.  { "Unlock
7300: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7310: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
7320: 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20  ockFile,        
7330: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7340: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7350: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7360: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7390: 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46  ifndef osUnlockF
73a0: 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  ile.#define osUn
73b0: 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  lockFile ((BOOL(
73c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
73d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
73e0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
73f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  RD))aSyscall[57]
7400: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7410: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
7420: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
7430: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
7440: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7450: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
7460: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7470: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
7480: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7490: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
74c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f  ..#define osUnlo
74d0: 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28  ckFileEx ((BOOL(
74e0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
74f0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
7500: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
7510: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
7520: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
7530: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7540: 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e  _WINCE || !defin
7550: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
7560: 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  AL).  { "UnmapVi
7570: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7580: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
7590: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
75a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
75b0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
75c0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
75d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7600: 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65  efine osUnmapVie
7610: 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  wOfFile ((BOOL(W
7620: 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29  INAPI*)(LPCVOID)
7630: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
7640: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69  urrent)..  { "Wi
7650: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7660: 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  e",     (SYSCALL
7670: 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  )WideCharToMulti
7680: 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Byte,     0 },..
7690: 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68  #define osWideCh
76a0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28  arToMultiByte ((
76b0: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
76c0: 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c  T,DWORD,LPCWSTR,
76d0: 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c  int,LPSTR,int, \
76e0: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c  .        LPCSTR,
76f0: 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c  LPBOOL))aSyscall
7700: 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [60].pCurrent)..
7710: 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c    { "WriteFile",
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7730: 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c  SYSCALL)WriteFil
7740: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7750: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
7760: 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f  sWriteFile ((BOO
7770: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7780: 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  E,LPCVOID,DWORD,
7790: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
77a0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
77b0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
77c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
77d0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
77e0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
77f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7800: 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74  CALL)CreateEvent
7810: 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  ExW,          0 
7820: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7830: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7840: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7850: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7860: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7870: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7880: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20  sCreateEventExW 
7890: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
78a0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
78b0: 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c  RIBUTES,LPCWSTR,
78c0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
78d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
78e0: 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [62].pCurrent)..
78f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7900: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
7910: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
7920: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69      (SYSCALL)Wai
7930: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7940: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
7950: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7960: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7970: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
79a0: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
79b0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44  SingleObject ((D
79c0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
79d0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
79e0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
79f0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  63].pCurrent).. 
7a00: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7a10: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7a20: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
7a30: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
7a40: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7a50: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7a60: 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49  ectEx ((DWORD(WI
7a70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
7a80: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42  ORD, \.        B
7a90: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 34  OOL))aSyscall[64
7aa0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7ab0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7ac0: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7ad0: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
7ae0: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
7af0: 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20  PointerEx,      
7b00: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7b10: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7b20: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
7b30: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7b50: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7b60: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
7b70: 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  terEx ((BOOL(WIN
7b80: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52  API*)(HANDLE,LAR
7b90: 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20  GE_INTEGER, \.  
7ba0: 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54        PLARGE_INT
7bb0: 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73  EGER,DWORD))aSys
7bc0: 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e  call[65].pCurren
7bd0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7be0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
7bf0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7c00: 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53  yHandleEx", (SYS
7c10: 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f  CALL)GetFileInfo
7c20: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7c30: 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  x, 0 },.#else.  
7c40: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
7c50: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
7c60: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7c80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7c90: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  ine osGetFileInf
7ca0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
7cb0: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7cc0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
7cd0: 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42       FILE_INFO_B
7ce0: 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c  Y_HANDLE_CLASS,L
7cf0: 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79  PVOID,DWORD))aSy
7d00: 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65  scall[66].pCurre
7d10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7d20: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
7d30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7d40: 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69  _WAL).  { "MapVi
7d50: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
7d60: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
7d70: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7d80: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
7d90: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
7da0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
7db0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7de0: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
7df0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
7e00: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
7e10: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
7e20: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
7e30: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
7e40: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
7e50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7e60: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
7e70: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
7e80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
7e90: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
7ea0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7eb0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
7ec0: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
7ed0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7f00: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
7f10: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
7f20: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
7f30: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7f40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
7f50: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
7f60: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
7f70: 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72  Syscall[68].pCur
7f80: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7f90: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
7fa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7fb0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
7fc0: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
7fd0: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
7fe0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
7ff0: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
8000: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8010: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
8020: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
8030: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8060: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
8070: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
8080: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
8090: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
80a0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
80b0: 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [69].pCurrent)..
80c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
80d0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
80e0: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
80f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
8100: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
8110: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8120: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8130: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8140: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8170: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
8180: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
8190: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
81a0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70  ))aSyscall[70].p
81b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
81c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
81d0: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
81e0: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
81f0: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
8200: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
8210: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8220: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8230: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8240: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8250: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8260: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8270: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
8280: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
8290: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
82a0: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
82b0: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
82c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
82d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
82e0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
82f0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8300: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8310: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
8320: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
8330: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
8340: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
8350: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
8360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8370: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8380: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
8390: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
83a0: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
83b0: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
83c0: 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[72].pCurrent)
83d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
83e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
83f0: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
8400: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8410: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
8420: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
8430: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8440: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
8450: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
8460: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8490: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
84a0: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
84b0: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
84c0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33  STR))aSyscall[73
84d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
84e0: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
84f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8500: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
8510: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
8520: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
8530: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
8540: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
8550: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34  OID))aSyscall[74
8560: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8570: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8580: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
8590: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
85a0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
85b0: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
85c0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
85d0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
85e0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
85f0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
8600: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
8610: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8630: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8640: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
8650: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
8660: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
8670: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8680: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
8690: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
86a0: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
86b0: 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72  yscall[75].pCurr
86c0: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
86d0: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
86e0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
86f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
8700: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
8710: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
8720: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
8730: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
8740: 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20  "win32" VFSes.  
8750: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8760: 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c   opon successful
8770: 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a  ly updating the.
8780: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70  ** system call p
8790: 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54  ointer, or SQLIT
87a0: 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68  E_NOTFOUND if th
87b0: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67  ere is no config
87c0: 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d  urable.** system
87d0: 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d   call named zNam
87e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
87f0: 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
8800: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
8810: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
8820: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
8830: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
8840: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8850: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
8860: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
8870: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
8880: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
8890: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
88a0: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
88b0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
88c0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
88d0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
88e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
88f0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
8900: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
8910: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
8920: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
8930: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
8940: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
8950: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
8960: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
8970: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
8980: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
8990: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
89a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
89b0: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
89c0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
89d0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
89e0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
89f0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
8a00: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
8a10: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
8a20: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
8a30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
8a40: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
8a50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
8a60: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
8a70: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
8a80: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
8a90: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
8aa0: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
8ab0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8ac0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
8ad0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
8ae0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
8af0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
8b00: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
8b10: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
8b20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
8b30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
8b40: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
8b50: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
8b60: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
8b70: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
8b80: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8b90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8ba0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
8bb0: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
8bc0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
8bd0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
8be0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8bf0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
8c00: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
8c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8c30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8c40: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
8c50: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
8c60: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
8c70: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
8c80: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
8c90: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
8ca0: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
8cb0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
8cc0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
8cd0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
8ce0: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
8cf0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
8d00: 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65  _ptr winGetSyste
8d10: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
8d20: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a  _vfs *pNotUsed,.
8d30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8d40: 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ame.){.  unsigne
8d50: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53  d int i;..  UNUS
8d60: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
8d70: 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d  tUsed);.  for(i=
8d80: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8d90: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8da0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8db0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
8dc0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
8dd0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
8de0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
8df0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
8e00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8e10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8e20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
8e30: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
8e40: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
8e50: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
8e60: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
8e70: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
8e80: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
8e90: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
8ea0: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
8eb0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
8ec0: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8ed0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
8ee0: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
8ef0: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
8f00: 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65  onst char *winNe
8f10: 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c  xtSystemCall(sql
8f20: 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e  ite3_vfs *p, con
8f30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
8f40: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a  .  int i = -1;..
8f50: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8f60: 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61  ER(p);.  if( zNa
8f70: 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  me ){.    for(i=
8f80: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
8f90: 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29  Syscall)-1; i++)
8fa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
8fb0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
8fc0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
8fd0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
8fe0: 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c   }.  for(i++; i<
8ff0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
9000: 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ll); i++){.    i
9010: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
9020: 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74  Current!=0 ) ret
9030: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
9040: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74  zName;.  }.  ret
9050: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
9060: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
9070: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  LLOC./*.** If a 
9080: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9090: 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  p has been confi
90a0: 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  gured, this func
90b0: 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70  tion will attemp
90c0: 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20  t to.** compact 
90d0: 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73  it.  Upon succes
90e0: 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c  s, SQLITE_OK wil
90f0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
9100: 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e  Upon failure, on
9110: 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e  e.** of SQLITE_N
9120: 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52  OMEM, SQLITE_ERR
9130: 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  OR, or SQLITE_NO
9140: 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72  TFOUND will be r
9150: 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a  eturned.  The.**
9160: 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67   "pnLargest" arg
9170: 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65  ument, if non-ze
9180: 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ro, will be used
9190: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73   to return the s
91a0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61  ize of the.** la
91b0: 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20  rgest committed 
91c0: 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68  free block in th
91d0: 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73  e heap, in bytes
91e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
91f0: 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68  _win32_compact_h
9200: 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72  eap(LPUINT pnLar
9210: 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  gest){.  int rc 
9220: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
9230: 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30  INT nLargest = 0
9240: 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  ;.  HANDLE hHeap
9250: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
9260: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
9270: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
9280: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
9290: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
92a0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
92b0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
92c0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
92d0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
92e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
92f0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
9300: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
9310: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
9320: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9330: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
9340: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21   );.#endif.#if !
9350: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
9360: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
9370: 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67  NRT.  if( (nLarg
9380: 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63  est=osHeapCompac
9390: 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  t(hHeap, SQLITE_
93a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
93b0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f  ))==0 ){.    DWO
93c0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  RD lastErrno = o
93d0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
93e0: 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72  .    if( lastErr
93f0: 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a  no==NO_ERROR ){.
9400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
9410: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
9420: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
9430: 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65  ompact (no space
9440: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9460: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9470: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9480: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
9490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
94a0: 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  log(SQLITE_ERROR
94b0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
94c0: 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20  pCompact (%lu), 
94d0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
94f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
9500: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20  oid*)hHeap);.   
9510: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
9520: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
9530: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f  #else.  sqlite3_
9540: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  log(SQLITE_NOTFO
9550: 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  UND, "failed to 
9560: 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61  HeapCompact, hea
9570: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
9580: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
9590: 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  p);.  rc = SQLIT
95a0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64  E_NOTFOUND;.#end
95b0: 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65  if.  if( pnLarge
95c0: 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20  st ) *pnLargest 
95d0: 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65  = nLargest;.  re
95e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
95f0: 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74  * If a Win32 nat
9600: 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65 65  ive heap has bee
9610: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68  n configured, th
9620: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9630: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64   attempt to.** d
9640: 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65  estroy and recre
9650: 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65 20  ate it.  If the 
9660: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9670: 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65  p is not isolate
9680: 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20  d and/or.** the 
9690: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
96a0: 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64  sed() function d
96b0: 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a  oes not return z
96c0: 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ero, SQLITE_BUSY
96d0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75   will.** be retu
96e0: 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e  rned and no chan
96f0: 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  ges will be made
9700: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61   to the Win32 na
9710: 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e  tive heap..*/.in
9720: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
9730: 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20  reset_heap(){.  
9740: 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f  int rc;.  MUTEX_
9750: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
9760: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
9770: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61   /* The main sta
9780: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d  tic mutex */.  M
9790: 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
97a0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b  te3_mutex *pMem;
97b0: 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d   )    /* The mem
97c0: 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65 78  sys static mutex
97d0: 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   */.  MUTEX_LOGI
97e0: 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
97f0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
9800: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
9810: 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
9820: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65  MUTEX_LOGIC( pMe
9830: 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  m = sqlite3Mutex
9840: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
9850: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20  EX_STATIC_MEM); 
9860: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
9870: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
9880: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9890: 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20  x_enter(pMem);. 
98a0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
98b0: 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d  ic();.  if( winM
98c0: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
98d0: 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77  L && winMemGetOw
98e0: 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65 33  ned() && sqlite3
98f0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
9900: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
9910: 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
9920: 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  , there should b
9930: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
9940: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
9950: 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68  ons on.    ** th
9960: 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73  e heap.  Also, s
9970: 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61  ince both the ma
9980: 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20  ster and memsys 
9990: 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e  locks are curren
99a0: 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67  tly.    ** being
99b0: 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20   held by us, no 
99c0: 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28  other function (
99d0: 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65  i.e. from anothe
99e0: 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64  r thread) should
99f0: 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20  .    ** be able 
9a00: 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20 74  to even access t
9a10: 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70  he heap.  Attemp
9a20: 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64  t to destroy and
9a30: 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20   recreate our.  
9a40: 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69    ** isolated Wi
9a50: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9a60: 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  now..    */.    
9a70: 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65  assert( winMemGe
9a80: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b  tHeap()!=NULL );
9a90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e  .    assert( win
9aa0: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
9ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9ac0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9ad0: 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e  ()==0 );.    win
9ae0: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d  MemShutdown(winM
9af0: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b  emGetDataPtr());
9b00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e  .    assert( win
9b10: 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55  MemGetHeap()==NU
9b20: 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LL );.    assert
9b30: 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  ( !winMemGetOwne
9b40: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
9b50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
9b60: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
9b70: 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e     rc = winMemIn
9b80: 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61  it(winMemGetData
9b90: 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65  Ptr());.    asse
9ba0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9bb0: 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65  K || winMemGetHe
9bc0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
9bd0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9be0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
9bf0: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
9c00: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9c10: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
9c20: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
9c30: 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  )==0 );.  }else{
9c40: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
9c50: 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20  he Win32 native 
9c60: 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d  heap cannot be m
9c70: 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65 20  odified because 
9c80: 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65  it may be in use
9c90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
9ca0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
9cb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
9cc0: 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a  ex_leave(pMem);.
9cd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9ce0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
9cf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
9d00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9d10: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
9d20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9d30: 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65  tion outputs the
9d40: 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53 49   specified (ANSI
9d50: 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  ) string to the 
9d60: 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a  Win32 debugger.*
9d70: 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  * (if available)
9d80: 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/..void sqlit
9d90: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
9da0: 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20  ebug(const char 
9db0: 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29  *zBuf, int nBuf)
9dc0: 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75 66  {.  char zDbgBuf
9dd0: 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  [SQLITE_WIN32_DB
9de0: 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69  G_BUF_SIZE];.  i
9df0: 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42  nt nMin = MIN(nB
9e00: 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33  uf, (SQLITE_WIN3
9e10: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d  2_DBG_BUF_SIZE -
9e20: 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20   1)); /* may be 
9e30: 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69  negative. */.  i
9e40: 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69  f( nMin<-1 ) nMi
9e50: 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e  n = -1; /* all n
9e60: 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 62  egative values b
9e70: 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61  ecome -1. */.  a
9e80: 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20  ssert( nMin==-1 
9e90: 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d  || nMin==0 || nM
9ea0: 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  in<SQLITE_WIN32_
9eb0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a  DBG_BUF_SIZE );.
9ec0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
9ed0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
9ee0: 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  I).  if( nMin>0 
9ef0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
9f00: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
9f10: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
9f20: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
9f30: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
9f40: 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74  nMin);.    osOut
9f50: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
9f60: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
9f70: 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  e{.    osOutputD
9f80: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66  ebugStringA(zBuf
9f90: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  );.  }.#elif def
9fa0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9fb0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65  2_HAS_WIDE).  me
9fc0: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
9fd0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
9fe0: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69  G_BUF_SIZE);.  i
9ff0: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  f ( osMultiByteT
a000: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20  oWideChar(.     
a010: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70       osAreFileAp
a020: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
a030: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c  P : CP_OEMCP, 0,
a040: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
a050: 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a   nMin, (LPWSTR)z
a060: 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57  DbgBuf, SQLITE_W
a070: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
a080: 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29  E/sizeof(WCHAR))
a090: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
a0a0: 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75  n;.  }.  osOutpu
a0b0: 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c  tDebugStringW((L
a0c0: 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b  PCWSTR)zDbgBuf);
a0d0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69  .#else.  if( nMi
a0e0: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
a0f0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
a100: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a110: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
a120: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
a130: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66  uf, nMin);.    f
a140: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
a150: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20  %s", zDbgBuf);. 
a160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
a170: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
a180: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
a190: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
a1a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
a1b0: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20  ne suspends the 
a1c0: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66  current thread f
a1d0: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a  or at least ms.*
a1e0: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20  * milliseconds. 
a1f0: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
a200: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ent to the Win32
a210: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61   Sleep() interfa
a220: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ce..*/.#if SQLIT
a230: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69  E_OS_WINRT.stati
a240: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62  c HANDLE sleepOb
a250: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  j = NULL;.#endif
a260: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
a270: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44  in32_sleep(DWORD
a280: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a   milliseconds){.
a290: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
a2a0: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70  NRT.  if ( sleep
a2b0: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj==NULL ){.   
a2c0: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
a2d0: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c  eateEventExW(NUL
a2e0: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f  L, NULL, CREATE_
a2f0: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53  EVENT_MANUAL_RES
a300: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ET,.            
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29      SYNCHRONIZE)
a330: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a340: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
a350: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ;.  osWaitForSin
a360: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65  gleObjectEx(slee
a370: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e  pObj, millisecon
a380: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73  ds, FALSE);.#els
a390: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c  e.  osSleep(mill
a3a0: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69  iseconds);.#endi
a3b0: 66 0a 7d 0a 0a 44 57 4f 52 44 20 73 71 6c 69 74  f.}..DWORD sqlit
a3c0: 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44  e3Win32Wait(HAND
a3d0: 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44  LE hObject){.  D
a3e0: 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65  WORD rc;.  while
a3f0: 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f  ( (rc = osWaitFo
a400: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
a410: 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54  hObject, INFINIT
a420: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29            TRUE))
a450: 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45  ==WAIT_IO_COMPLE
a460: 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72  TION ){}.  retur
a470: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
a480: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
a490: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
a4a0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
a4b0: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
a4c0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
a4d0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
a4e0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
a4f0: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
a500: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
a510: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
a520: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
a530: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
a540: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
a550: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
a560: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
a570: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
a580: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
a590: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
a5a0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
a5b0: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
a5c0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
a5d0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
a5e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a5f0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
a600: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
a610: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
a620: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
a630: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
a640: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
a650: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
a660: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
a670: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23  eEx() API..*/..#
a680: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a690: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
a6a0: 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49 54  IONEX) || !SQLIT
a6b0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
a6c0: 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73  ONEX.# define os
a6d0: 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69  IsNT()  (1).#eli
a6e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
a6f0: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
a700: 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64  INRT || !defined
a710: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a720: 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65  S_ANSI).# define
a730: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a740: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  elif !defined(SQ
a750: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
a760: 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73  IDE).# define os
a770: 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73  IsNT()  (0).#els
a780: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f  e.  static int o
a790: 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20  sIsNT(void){.   
a7a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f   if( sqlite3_os_
a7b0: 74 79 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64  type==0 ){.#if d
a7c0: 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52  efined(NTDDI_VER
a7d0: 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56  SION) && NTDDI_V
a7e0: 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f  ERSION >= NTDDI_
a7f0: 57 49 4e 38 0a 20 20 20 20 20 20 4f 53 56 45 52  WIN8.      OSVER
a800: 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b  SIONINFOW sInfo;
a810: 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  .      sInfo.dwO
a820: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
a830: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
a840: 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72  ;.      osGetVer
a850: 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b  sionExW(&sInfo);
a860: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 4f 53 56  .#else.      OSV
a870: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
a880: 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64  o;.      sInfo.d
a890: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
a8a0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
a8b0: 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56  o);.      osGetV
a8c0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
a8d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
a8e0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
a8f0: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
a900: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
a910: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
a920: 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  : 1;.    }.    r
a930: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73  eturn sqlite3_os
a940: 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65  _type==2;.  }.#e
a950: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
a960: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a970: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
a980: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
a990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a9a0: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
a9b0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
a9c0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
a9d0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
a9e0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
a9f0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
aa00: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
aa10: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
aa20: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
aa30: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
aa40: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
aa50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
aa60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
aa70: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
aa80: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
aa90: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
aaa0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
aab0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
aac0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
aad0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
aae0: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
aaf0: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
ab00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
ab10: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
ab20: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
ab30: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
ab40: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
ab50: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
ab60: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
ab70: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
ab80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ab90: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
aba0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
abb0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
abc0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
abd0: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
abe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
abf0: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
ac00: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
ac10: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
ac20: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
ac30: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
ac40: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
ac50: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
ac60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
ac70: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
ac80: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
ac90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
aca0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
acb0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
acc0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
acd0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
ace0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
acf0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
ad00: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
ad10: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
ad20: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
ad30: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
ad40: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
ad50: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
ad60: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
ad70: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
ad80: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
ad90: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
ada0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
adb0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
adc0: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
add0: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
ade0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
adf0: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
ae00: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
ae10: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
ae20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ae30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
ae40: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
ae50: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
ae60: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
ae70: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
ae80: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
ae90: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
aea0: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
aeb0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
aec0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
aed0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
aee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
aef0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
af00: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
af10: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
af20: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
af30: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
af40: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
af50: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
af60: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
af70: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
af80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
af90: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
afa0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
afb0: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
afc0: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
afd0: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
afe0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
aff0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b000: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
b010: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
b020: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
b030: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
b040: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b050: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
b060: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
b070: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
b080: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b090: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
b0a0: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
b0b0: 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  tes (%lu), heap=
b0c0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
b0d0: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
b0e0: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
b0f0: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
b100: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
b110: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
b120: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
b130: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
b140: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
b150: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
b160: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
b170: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
b180: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
b190: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
b1a0: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
b1b0: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
b1c0: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
b1d0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
b1e0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
b1f0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
b200: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
b210: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
b220: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
b230: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
b240: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
b250: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b260: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
b270: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
b280: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
b290: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b2a0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20  _HEAP_FLAGS, p) 
b2b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
b2c0: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
b2d0: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
b2e0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b2f0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b300: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
b310: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
b320: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b330: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
b340: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
b350: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
b360: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
b370: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
b380: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
b390: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
b3a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
b3b0: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
b3c0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
b3d0: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
b3e0: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
b3f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
b400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b410: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
b420: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
b430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
b440: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
b450: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b460: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
b470: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
b480: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
b490: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
b4a0: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
b4b0: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
b4c0: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
b4d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
b4e0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b4f0: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
b500: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
b510: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b520: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
b530: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66  M_MAGIC2 );..#if
b540: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b550: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
b560: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
b570: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
b580: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44  ->hHeap ){.    D
b590: 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69  WORD dwInitialSi
b5a0: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
b5b0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
b5c0: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61  ;.    DWORD dwMa
b5d0: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f  ximumSize = (DWO
b5e0: 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  RD)sqlite3Global
b5f0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20  Config.nHeap;.  
b600: 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53    if( dwMaximumS
b610: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
b620: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
b630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b640: 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20  P_MAX_SIZE;.    
b650: 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74  }else if( dwInit
b660: 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75  ialSize>dwMaximu
b670: 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64  mSize ){.      d
b680: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64  wInitialSize = d
b690: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20  wMaximumSize;.  
b6a0: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
b6b0: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
b6c0: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
b6d0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b6e0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74 69           dwIniti
b710: 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75  alSize, dwMaximu
b720: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  mSize);.    if( 
b730: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
b740: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
b750: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b760: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
b770: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b780: 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c  Create (%lu), fl
b790: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
b7a0: 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c  =%lu, maxSize=%l
b7b0: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
b7c0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
b7d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b7e0: 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69  P_FLAGS, dwIniti
b7f0: 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  alSize,.        
b800: 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29    dwMaximumSize)
b810: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b820: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b830: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
b840: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55  ta->bOwned = TRU
b850: 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  E;.    assert( p
b860: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
b870: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  ed );.  }.#else.
b880: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
b890: 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63  Heap = osGetProc
b8a0: 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28  essHeap();.  if(
b8b0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
b8c0: 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Heap ){.    sqli
b8d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
b8e0: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66  OMEM,.        "f
b8f0: 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63  ailed to GetProc
b900: 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c 20  essHeap (%lu)", 
b910: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
b920: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
b930: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
b940: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
b950: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
b960: 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65   assert( !pWinMe
b970: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
b980: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
b990: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
b9a0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
b9b0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
b9c0: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
b9d0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
b9e0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b9f0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
ba00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
ba10: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
ba20: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
ba30: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
ba40: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
ba50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
ba60: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
ba70: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
ba80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ba90: 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Deinitialize t
baa0: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  his module..*/.s
bab0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
bac0: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
bad0: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
bae0: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
baf0: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
bb00: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
bb10: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
bb20: 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ta ) return;.  a
bb30: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bb40: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
bb50: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
bb60: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bb70: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
bb80: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20  EM_MAGIC2 );..  
bb90: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
bba0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
bbb0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bbc0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
bbd0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
bbe0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
bbf0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
bc00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
bc10: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
bc20: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
bc30: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
bc40: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
bc50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bc60: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
bc70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
bc80: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
bc90: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
bca0: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
bcb0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bcc0: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
bcd0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bce0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
bcf0: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
bd00: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
bd10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bd20: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
bd30: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57  ror(), (void*)pW
bd40: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bd50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bd60: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bd70: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
bd80: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
bd90: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c  ata->hHeap = NUL
bda0: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
bdb0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
bdc0: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
bdd0: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
bde0: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
bdf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
be00: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
be10: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
be20: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
be30: 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65  e. The.** argume
be40: 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20  nts specify the 
be50: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
be60: 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a  to manage..**.**
be70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
be80: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
be90: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
bea0: 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a  , and therefore.
beb0: 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
bec0: 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  ed to be threads
bed0: 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e  afe (it is not).
bee0: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
bef0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
bf00: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
bf10: 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  2(void){.  stati
bf20: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
bf30: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d  mem_methods winM
bf40: 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  emMethods = {.  
bf50: 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a    winMemMalloc,.
bf60: 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a      winMemFree,.
bf70: 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f      winMemReallo
bf80: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a  c,.    winMemSiz
bf90: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75  e,.    winMemRou
bfa0: 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  ndup,.    winMem
bfb0: 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Init,.    winMem
bfc0: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77  Shutdown,.    &w
bfd0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b  in_mem_data.  };
bfe0: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65  .  return &winMe
bff0: 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69  mMethods;.}..voi
c000: 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  d sqlite3MemSetD
c010: 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20  efault(void){.  
c020: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
c030: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
c040: 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47  LOC, sqlite3MemG
c050: 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65  etWin32());.}.#e
c060: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
c070: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
c080: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
c090: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
c0a0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
c0b0: 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a  e (UTF-16?). .**
c0c0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c0d0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c0e0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c0f0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
c100: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
c110: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
c120: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
c130: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
c140: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
c150: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
c160: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
c170: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
c180: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
c190: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
c1a0: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
c1b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c1c0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
c1d0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
c1e0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
c1f0: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
c200: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
c210: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
c220: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
c230: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
c240: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
c250: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
c260: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
c270: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
c280: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
c2b0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
c2c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c2d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
c2e0: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
c2f0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
c300: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
c310: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
c320: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
c330: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
c340: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
c350: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
c360: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
c370: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
c380: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
c390: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
c3a0: 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54  odeToUtf8(LPCWST
c3b0: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
c3c0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
c3d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
c3e0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
c3f0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
c400: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
c410: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
c420: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
c430: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c440: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c450: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
c460: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c470: 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20  Zero( nByte );. 
c480: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
c490: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c4a0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
c4b0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
c4c0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
c4d0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
c4e0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
c4f0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
c520: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c530: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c540: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
c550: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
c560: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c570: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
c580: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
c590: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
c5a0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
c5b0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
c5c0: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
c5d0: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
c5e0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
c5f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
c600: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
c610: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
c620: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
c630: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
c640: 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54   LPWSTR winMbcsT
c650: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
c660: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
c670: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
c680: 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65  LPWSTR zMbcsFile
c690: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
c6a0: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
c6b0: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
c6c0: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
c6d0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
c6e0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
c6f0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
c700: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
c710: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48     0)*sizeof(WCH
c740: 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  AR);.  if( nByte
c750: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73  n 0;.  }.  zMbcs
c770: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
c780: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
c790: 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73  yte*sizeof(zMbcs
c7a0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
c7b0: 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e    if( zMbcsFilen
c7c0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
c7d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
c7e0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
c7f0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
c800: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
c810: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c  me, -1, zMbcsFil
c820: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20         nByte);. 
c850: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
c860: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c870: 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29  e(zMbcsFilename)
c880: 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e  ;.    zMbcsFilen
c890: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
c8a0: 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e  eturn zMbcsFilen
c8b0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
c8c0: 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20  nvert Microsoft 
c8d0: 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69  Unicode to multi
c8e0: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  -byte character 
c8f0: 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e  string, based on
c900: 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41   the.** user's A
c910: 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a  NSI codepage..**
c920: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c930: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c940: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c950: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
c960: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
c970: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
c980: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43  nicodeToMbcs(LPC
c990: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
c9a0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
c9b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
c9c0: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
c9d0: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
c9e0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
c9f0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
ca00: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
ca10: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
ca20: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
ca30: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
ca40: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
ca50: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
ca60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ca70: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
ca80: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
ca90: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
caa0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
cab0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
cac0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
cad0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
cae0: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
caf0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
cb00: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a   -1, zFilename,.
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
cb40: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
cb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
cb60: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
cb70: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
cb80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
cb90: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
cba0: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
cbb0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
cbc0: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
cbd0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
cbe0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
cbf0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
cc00: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
cc10: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
cc20: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
cc30: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
cc40: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
cc50: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
cc60: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50  lenameUtf8;.  LP
cc70: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
cc80: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
cc90: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  MbcsToUnicode(zF
cca0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
ccb0: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
ccc0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ccd0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
cce0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
ccf0: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
cd00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
cd10: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
cd20: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
cd30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
cd40: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
cd50: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
cd60: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
cd70: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
cd80: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
cd90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
cda0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
cdb0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
cdc0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
cdd0: 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  mbcs(const char 
cde0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
cdf0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
ce00: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
ce10: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
ce20: 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  de = winUtf8ToUn
ce30: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
ce40: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
ce50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ce60: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
ce70: 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e  nameMbcs = winUn
ce80: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
ce90: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
cea0: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
ceb0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
cec0: 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameMbcs;.}../*.*
ced0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
cee0: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
cef0: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
cf00: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
cf10: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
cf20: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
cf30: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
cf40: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
cf50: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
cf60: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
cf70: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
cf80: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
cf90: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
cfa0: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
cfb0: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
cfc0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
cfd0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
cfe0: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
cff0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
d000: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
d010: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
d020: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
d030: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
d040: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
d050: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
d060: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
d070: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
d080: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
d090: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
d0a0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
d0b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
d0c0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
d0d0: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
d0e0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
d0f0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
d100: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
d110: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
d120: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
d130: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
d140: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
d150: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
d160: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
d170: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
d180: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
d190: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
d1a0: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
d1b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
d1c0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
d1d0: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
d1e0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
d1f0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
d200: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
d210: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
d220: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
d230: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
d240: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
d250: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
d260: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
d270: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
d280: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
d290: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
d2a0: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
d2b0: 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  alueUtf8 = winUn
d2c0: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c  icodeToUtf8(zVal
d2d0: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ue);.      if ( 
d2e0: 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b  zValueUtf8==0 ){
d2f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d300: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d320: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70  sqlite3_free(*pp
d330: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
d340: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a  *ppDirectory = z
d350: 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72  ValueUtf8;.    r
d360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d370: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
d380: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
d390: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
d3a0: 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c  value of winGetL
d3b0: 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69  astErrorMsg.** i
d3c0: 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
d3d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
d3e0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
d3f0: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
d400: 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
d410: 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
d420: 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74  ncated)..*/.stat
d430: 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
d440: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
d450: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
d460: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
d470: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
d480: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
d490: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
d4a0: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
d4b0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
d4c0: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
d4d0: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
d4e0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
d4f0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
d500: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
d510: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
d520: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
d530: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
d540: 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
d550: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
d560: 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54  NRT.    WCHAR zT
d570: 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57  empWide[SQLITE_W
d580: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
d590: 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77  CHARS+1];.    dw
d5a0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
d5b0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
d5c0: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
d5d0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
d600: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
d630: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
d6a0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
d6d0: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20  _ERRMSG_CHARS,. 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
d700: 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52  #else.    LPWSTR
d710: 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c   zTempWide = NUL
d720: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
d730: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
d740: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
d750: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
d760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
d780: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
d790: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
d7c0: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
d7d0: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
d820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d840: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d860: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
d870: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
d8c0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
d8d0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
d8e0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
d8f0: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
d900: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
d910: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
d920: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
d930: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
d940: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
d950: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
d960: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
d970: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
d980: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
d990: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
d9a0: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
d9b0: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
d9c0: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
d9d0: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
d9e0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
d9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
da00: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
da10: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
da20: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
da30: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
da40: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
da50: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
da60: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
da90: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
daa0: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
dad0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
dae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
db00: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
db70: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
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 30 2c 0a 20 20 20 20 20 20         0,.      
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 30 29 3b 0a 20 20 20 20 69         0);.    i
dbc0: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
dbd0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
dbe0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
dbf0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
dc00: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
dc10: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
dc20: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
dc30: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
dc40: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
dc50: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
dc60: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
dc70: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
dc80: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
dc90: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
dca0: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
dcb0: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
dcc0: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
dcd0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
dce0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
dcf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
dd00: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
dd10: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78  , "OsError 0x%lx
dd20: 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72   (%lu)", lastErr
dd30: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
dd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
dd50: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
dd60: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
dd70: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
dd80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
dd90: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
dda0: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
ddb0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
ddc0: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
ddd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
dde0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
ddf0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
de00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
de10: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
de20: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
de30: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
de40: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
de50: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
de60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
de70: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
de80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
de90: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
dea0: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
deb0: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
dec0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
ded0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
dee0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
def0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
df00: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
df10: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
df20: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a  quivalent from .
df30: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
df40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
df50: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
df60: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
df70: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
df80: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
df90: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
dfa0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
dfb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
dfc0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
dfd0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
dfe0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
dff0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
e000: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
e010: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
e020: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
e030: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
e040: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
e050: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
e060: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
e070: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
e080: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
e090: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
e0a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
e0b0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
e0c0: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
e0f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
e100: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
e110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
e120: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
e130: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e140: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
e150: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
e160: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
e170: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
e180: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
e190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e1a0: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
e1b0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
e1c0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
e1f0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
e200: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
e210: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
e220: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
e230: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
e240: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
e250: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e280: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
e290: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69  Msg[0] = 0;.  wi
e2a0: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
e2b0: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
e2c0: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
e2d0: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
e2e0: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
e2f0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
e300: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
e310: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
e320: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
e330: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
e340: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
e350: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
e360: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
e370: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
e380: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
e390: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
e3a0: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
e3b0: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
e3c0: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
e3d0: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
e3e0: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
e3f0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
e400: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
e410: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
e420: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
e430: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
e440: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
e450: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
e460: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
e470: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
e480: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
e490: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
e4a0: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
e4b0: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
e4c0: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
e4d0: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
e4e0: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
e4f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
e500: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
e510: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
e520: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
e530: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e540: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e550: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
e560: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
e570: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
e580: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
e590: 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72  atic int winIoer
e5a0: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
e5b0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
e5c0: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
e5d0: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
e5e0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
e5f0: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
e600: 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52  Y;../*.** If a R
e610: 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69  eadFile() or Wri
e620: 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f  teFile() error o
e630: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
e640: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f  is routine.** to
e650: 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c   see if it shoul
e660: 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52  d be retried.  R
e670: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
e680: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
e690: 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70  SE.** to give up
e6a0: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
e6b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
e6c0: 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20  nRetryIoerr(int 
e6d0: 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20  *pnRetry, DWORD 
e6e0: 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52  *pError){.  DWOR
e6f0: 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
e700: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70  rror();.  if( *p
e710: 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72  nRetry>=winIoerr
e720: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28  Retry ){.    if(
e730: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
e740: 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
e750: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
e760: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45  ;.  }.  if( e==E
e770: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
e780: 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ED ||.      e==E
e790: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
e7a0: 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  ION ||.      e==
e7b0: 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
e7c0: 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73  OLATION ){.    s
e7d0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
e7e0: 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
e7f0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
e800: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
e810: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
e820: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
e830: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
e840: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
e850: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e860: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
e870: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
e880: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
e890: 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  inLogIoerr(int n
e8a0: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
e8b0: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
e8c0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
e8d0: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
e8e0: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
e8f0: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
e900: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
e910: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
e920: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
e930: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
e940: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
e950: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
e960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9a0: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
e9b0: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
e9c0: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
e9d0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
e9e0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
e9f0: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
ea00: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
ea10: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
ea20: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
ea30: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
ea40: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
ea50: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
ea60: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
ea70: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
ea80: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
ea90: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
eaa0: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
eab0: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
eac0: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
ead0: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
eae0: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
eaf0: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
eb00: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
eb10: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
eb20: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
eb30: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
eb40: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
eb50: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
eb60: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
eb70: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
eb80: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
eb90: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
eba0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
ebb0: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
ebc0: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
ebd0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
ebe0: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
ebf0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
ec00: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
ec10: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
ec20: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
ec30: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
ec40: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
ec50: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
ec60: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
ec70: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
ec80: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
ec90: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
eca0: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
ecb0: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
ecc0: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
ecd0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
ece0: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
ecf0: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
ed00: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
ed10: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
ed20: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
ed30: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
ed40: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
ed50: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
ed60: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
ed70: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
ed80: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
ed90: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
eda0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
edb0: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
edc0: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
edd0: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
ede0: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
edf0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
ee00: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
ee10: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
ee20: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
ee30: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
ee40: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
ee50: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
ee60: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
ee70: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
ee80: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
ee90: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
eea0: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
eeb0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
eec0: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
eed0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
eee0: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
eef0: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
ef00: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
ef10: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
ef20: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
ef30: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
ef40: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
ef50: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
ef60: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
ef70: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
ef80: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
ef90: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
efa0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
efb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
efc0: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
efd0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
efe0: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
eff0: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
f000: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
f010: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
f020: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
f030: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
f040: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
f050: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
f060: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
f070: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
f080: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
f090: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
f0a0: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
f0b0: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
f0c0: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
f0d0: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
f0e0: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
f0f0: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
f100: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
f110: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
f120: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
f130: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
f140: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
f150: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f160: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
f170: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
f180: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
f190: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
f1a0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f1b0: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
f1c0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
f1f0: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
f200: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
f210: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
f220: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
f230: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
f240: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
f250: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
f260: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
f270: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
f280: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
f290: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
f2a0: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
f2b0: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
f2c0: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
f2d0: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
f2e0: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
f2f0: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
f300: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
f310: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
f320: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
f330: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
f340: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
f350: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
f360: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
f370: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3a0: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
f3b0: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
f3c0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
f400: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
f410: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
f420: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
f430: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
f440: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
f450: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
f460: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
f470: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f480: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
f490: 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
f4a0: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
f4b0: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
f4c0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
f4d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
f4e0: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
f4f0: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
f500: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
f510: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
f520: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
f530: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
f540: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
f550: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
f560: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
f570: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
f580: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
f590: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
f5a0: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
f5b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
f5c0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
f5d0: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
f5e0: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
f5f0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
f600: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
f610: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
f620: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
f630: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f640: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
f650: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
f660: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f670: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
f680: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f690: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
f6a0: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
f6b0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
f6c0: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
f6d0: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
f6e0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
f6f0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
f700: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
f710: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
f720: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
f730: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
f740: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
f750: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
f760: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
f770: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
f780: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
f790: 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
f7a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f7b0: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
f7c0: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
f7d0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
f7e0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f7f0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
f800: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
f810: 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
f820: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
f830: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
f840: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
f850: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
f860: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
f870: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
f880: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
f890: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
f8a0: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
f8b0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
f8c0: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
f8d0: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
f8e0: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
f8f0: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
f900: 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20  f( bInit ){.    
f910: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
f920: 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
f930: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
f940: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
f950: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
f960: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
f970: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f980: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
f990: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
f9a0: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
f9b0: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
f9c0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
f9d0: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
f9e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
f9f0: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
fa00: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
fa10: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
fa20: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
fa30: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
fa40: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
fa50: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
fa60: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
fa70: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
fa80: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
fa90: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
faa0: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
fab0: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
fac0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
fad0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
fae0: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
faf0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
fb00: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
fb10: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
fb20: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
fb30: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
fb40: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
fb50: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
fb60: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
fb70: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
fb80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fb90: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
fba0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
fbb0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
fbc0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
fbd0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
fbe0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
fbf0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
fc00: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
fc10: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
fc20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
fc30: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
fc40: 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70  e */.    osUnmap
fc50: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
fc60: 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f  ->shared);.    o
fc70: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
fc80: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
fc90: 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
fca0: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
fcb0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
fcc0: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
fcd0: 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f  );    .    osClo
fce0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
fcf0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
fd00: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
fd10: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
fd20: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
fd30: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
fd40: 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
fd50: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
fd60: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
fd70: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
fd80: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
fd90: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
fda0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
fdb0: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
fdc0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
fdd0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
fde0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
fdf0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
fe00: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
fe10: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
fe20: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
fe30: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
fe40: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
fe50: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
fe60: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
fe70: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
fe80: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
fe90: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
fea0: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
feb0: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
fec0: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
fed0: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
fee0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
fef0: 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
ff00: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
ff10: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
ff20: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
ff30: 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
ff40: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
ff50: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
ff60: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
ff70: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
ff80: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
ff90: 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
ffa0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
ffb0: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
ffc0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
ffd0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
ffe0: 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
fff0: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
10000 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
10010 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10030 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
10040 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
10050 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10060 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10070 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
10080 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
10090 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
100a0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
100b0 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
100c0 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
100d0 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
100e0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
100f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
10100 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
10110 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
10120 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10130 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
10140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
10150 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10160 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
10170 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
10180 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10190 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
101a0 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
101b0 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
101c0 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
101d0 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
101e0 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
101f0 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
10200 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
10210 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
10220 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
10230 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
10240 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
10250 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10260 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
10270 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10280 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
10290 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
102a0 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
102b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
102c0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
102d0 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
102e0 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
102f0 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
10300 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
10310 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
10320 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
10330 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
10340 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10350 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
10360 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10370 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
10380 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10390 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
103a0 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
103b0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
103c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
103d0 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
103e0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
103f0 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
10410 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10420 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
10430 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10440 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10450 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
10460 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10470 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10480 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10490 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
104a0 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
104b0 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
104c0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
104d0 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
104e0 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
104f0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10500 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10510 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10520 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10530 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10540 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
10550 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
10560 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10570 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
10580 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
10590 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
105a0 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
105b0 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
105c0 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
105d0 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
105e0 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
105f0 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
10600 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
10610 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10620 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
10630 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
10640 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
10650 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10660 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
10670 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
10680 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
10690 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
106a0 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
106b0 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
106c0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
106d0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
106e0 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
106f0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10700 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
10710 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
10720 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10730 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
10740 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
10750 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
10760 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
10770 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10780 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10790 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
107a0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
107b0 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
107d0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
107e0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
107f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10800 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
10810 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
10820 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10830 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
10840 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
10850 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
10860 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
10870 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10880 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10890 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
108a0 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
108b0 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
108c0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
108d0 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
108e0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
108f0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10900 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10910 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10920 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
10930 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
10940 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
10950 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
10960 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
10970 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
10980 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10990 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
109a0 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
109b0 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
109c0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
109d0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
109e0 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
109f0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
10a00 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10a10 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10a20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10a30 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
10a40 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
10a50 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
10a60 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
10a70 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
10a80 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
10a90 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
10aa0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
10ab0 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
10ac0 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
10ad0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
10ae0 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
10af0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
10b00 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
10b60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10b70 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
10b80 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
10b90 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
10ba0 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
10bb0 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
10bc0 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
10bd0 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
10be0 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
10bf0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
10c00 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
10c10 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
10c20 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
10c30 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
10c40 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
10c50 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
10c60 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
10c70 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
10c80 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
10c90 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
10ca0 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
10cb0 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
10cc0 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
10cd0 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
10ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10cf0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
10d00 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
10d10 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
10d20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
10d30 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
10d40 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
10d50 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
10d60 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
10d70 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
10d80 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
10d90 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
10da0 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
10db0 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
10dc0 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
10dd0 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
10de0 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
10df0 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
10e00 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
10e10 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
10e20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
10e30 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
10e40 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
10e50 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
10e60 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
10e70 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
10e80 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
10e90 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
10ea0 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
10eb0 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
10ec0 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
10ed0 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
10ee0 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
10ef0 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
10f00 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
10f10 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
10f20 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
10f30 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
10f40 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
10f50 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
10f60 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
10f70 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
10f80 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
10f90 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
10fa0 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
10fb0 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
10fc0 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
10fd0 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
10ff0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
11000 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
11010 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
11020 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
11030 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
11040 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
11050 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11060 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11070 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
11080 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11090 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
110a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
110b0 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
110c0 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
110d0 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
110e0 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
110f0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11100 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
11110 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
11120 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
11130 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
11160 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
11170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
111c0 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
111d0 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
111e0 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
111f0 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
11200 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
11210 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
11220 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11270 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
11280 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
11290 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
112a0 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
112b0 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
112c0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
112d0 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
112e0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
112f0 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
11300 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
11310 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
11320 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
11330 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
11340 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
11350 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
11360 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
11370 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
11380 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
11390 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
113a0 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
113b0 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
113c0 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
113d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
113e0 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
113f0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
11400 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
11410 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
11420 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
11430 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
11440 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
11450 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
11460 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
11470 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11490 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
114a0 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
114b0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
114c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
114d0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
114e0 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
114f0 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
11500 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11520 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
11530 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
11540 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
11550 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
11560 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
11570 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
11580 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
11590 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
115a0 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
115b0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
115c0 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
115d0 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
115e0 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
115f0 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
11600 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
11610 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
11620 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
11630 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
11640 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
11650 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
11660 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
11670 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
11680 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
11690 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
116a0 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
116b0 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
116c0 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
116d0 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
116e0 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
116f0 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
11700 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11710 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
11720 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
11730 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  urred, it is als
11740 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
11750 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
11760 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
11770 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
11780 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
11790 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
117a0 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
117b0 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
117c0 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
117d0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
117e0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
117f0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11800 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
11810 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
11820 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
11830 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
11840 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11850 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
11860 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11880 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
11890 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
118a0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
118b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
118c0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
118d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
118e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
118f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
11900 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
11910 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
11920 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
11930 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
11940 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
11950 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
11960 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
11970 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
11980 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
11990 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
119a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
119b0 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
119c0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
119f0 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
11a00 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
11a10 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
11a20 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
11a30 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
11a40 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
11a50 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
11a60 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
11a70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11a80 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11a90 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
11aa0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11ab0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
11ac0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
11ae0 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
11af0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
11b00 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
11b10 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
11b20 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
11b30 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
11b40 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
11b50 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
11b60 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
11b70 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
11b80 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
11b90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
11ba0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11bb0 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
11bc0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
11bd0 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
11be0 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
11bf0 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
11c00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11c10 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
11c20 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
11c30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
11c40 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
11c50 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
11c60 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
11c70 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
11c80 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
11c90 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
11ca0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
11cb0 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
11cc0 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
11cd0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
11ce0 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
11cf0 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
11d00 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
11d10 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
11d20 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
11d30 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
11d40 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
11d50 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
11d60 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
11d70 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
11d80 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
11d90 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
11da0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
11db0 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
11dc0 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
11dd0 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
11de0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
11df0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
11e00 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
11e10 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
11e20 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
11e30 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
11e40 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
11e50 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
11e60 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
11e70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
11e80 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
11e90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
11ea0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
11eb0 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
11ec0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
11ed0 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
11ee0 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
11ef0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
11f00 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
11f10 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
11f20 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
11f30 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
11f40 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
11f50 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
11f60 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
11f70 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
11f80 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
11f90 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
11fa0 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
11fb0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
11fc0 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
11fd0 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
11fe0 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
11ff0 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
12000 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
12010 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
12020 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
12030 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
12040 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
12050 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
12060 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
12070 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
12080 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
12090 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
120a0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
120b0 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
120c0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
120d0 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
120e0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
120f0 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
12100 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
12110 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20  ffffff .        
12120 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
12130 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
12140 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
12150 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
12160 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
12170 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
12180 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
12190 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
121a0 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
121b0 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
121c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
121d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
121e0 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
121f0 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
12200 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
12210 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c  ("CLOSE file=%p,
12220 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
12230 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a  ->h, rc ? "ok" :
12240 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
12250 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
12260 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
12270 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
12280 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
12290 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
122a0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
122c0 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65  winClose", pFile
122d0 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->zPath);.}../*.
122e0 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
122f0 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
12300 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
12310 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
12320 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
12330 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
12340 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
12350 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
12360 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
12370 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
12380 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
12390 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
123a0 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
123b0 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
123c0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
123d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
123e0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
123f0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
12400 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
12410 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12420 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
12430 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
12440 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
12450 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
12460 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
12470 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51  et */.){.#if !SQ
12480 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12490 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
124a0 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
124b0 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
124c0 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
124d0 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
124e0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
124f0 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
12500 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
12510 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
12520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12530 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
12540 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
12550 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
12560 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
12570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12580 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
12590 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
125a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
125b0 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
125c0 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
125d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
125e0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
125f0 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
12600 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
12610 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
12620 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66  p, amount=%d, of
12630 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
12640 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12650 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
12660 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
12670 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
12680 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
12690 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
126a0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
126b0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
126c0 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
126d0 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
126e0 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
126f0 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
12700 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
12710 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
12720 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
12730 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
12740 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
12750 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
12760 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
12770 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
12780 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
12790 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
127a0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
127b0 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c  (("READ-MMAP fil
127c0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
127d0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
127e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
127f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12800 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12810 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
12820 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
12830 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
12840 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
12850 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
12860 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12870 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
12880 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
12890 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
128a0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
128b0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
128c0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
128d0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
128e0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
128f0 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
12900 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
12910 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
12920 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
12930 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
12940 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
12950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
12960 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
12970 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
12980 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
12990 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
129a0 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
129b0 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
129c0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
129d0 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
129e0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
129f0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
12a00 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
12a10 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
12a20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
12a30 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
12a40 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
12a50 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
12a60 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
12a70 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
12a80 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
12a90 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12aa0 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
12ab0 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
12ac0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12ad0 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
12ae0 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
12af0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
12b00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
12b10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12b20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
12b30 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
12b40 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12b50 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20  _IOERR_READ\n", 
12b60 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12b70 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
12b80 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12b90 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
12ba0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12bc0 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
12bd0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
12be0 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
12bf0 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
12c00 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
12c10 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
12c20 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
12c30 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
12c40 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
12c50 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
12c60 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
12c70 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52  nRead);.    OSTR
12c80 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
12c90 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
12ca0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e  ERR_SHORT_READ\n
12cb0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cd0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
12ce0 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  D;.  }..  OSTRAC
12cf0 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
12d00 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12d10 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12d30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
12d40 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
12d50 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
12d60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
12d70 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
12d80 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
12d90 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
12da0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
12db0 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
12dc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
12dd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
12de0 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
12df0 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
12e00 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
12e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12e20 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
12e30 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
12e40 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
12e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12e60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
12e70 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
12e80 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
12e90 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
12ea0 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
12eb0 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
12ec0 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
12ed0 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
12f00 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
12f10 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20  else false */.  
12f20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
12f30 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
12f40 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* File handle *
12f50 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
12f60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12f70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12f80 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61   retries */..  a
12f90 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
12fa0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12fb0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
12fc0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
12fd0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
12fe0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
12ff0 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
13000 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20  SQLITE_FULL);.. 
13010 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
13020 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
13030 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
13040 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
13050 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
13060 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
13070 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
13080 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13090 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
130a0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
130b0 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
130c0 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
130d0 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
130e0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
130f0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
13100 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
13110 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
13120 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
13130 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
13140 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
13150 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
13160 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
13170 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
13180 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
13190 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
131a0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
131b0 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
131c0 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50  ACE(("WRITE-MMAP
131d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
131e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
131f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
13200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13220 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
13230 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
13240 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
13250 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
13260 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
13270 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
13280 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
13290 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
132a0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
132b0 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
132c0 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
132d0 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
132e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
132f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13300 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b  E.  rc = winSeek
13310 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
13320 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
13330 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65   ){.#else.  {.#e
13340 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45  ndif.#if !SQLITE
13350 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56  _OS_WINCE.    OV
13360 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
13370 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
13380 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
13390 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
133a0 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
133b0 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
133c0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
133d0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
133e0 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
133f0 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
13400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13410 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
13420 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
13430 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13450 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
13460 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
13470 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
13480 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
13490 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
134a0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
134b0 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
134c0 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
134d0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65  _OS_WINCE.    me
134e0 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
134f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
13500 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
13510 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
13520 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
13530 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
13540 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
13550 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
13560 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13570 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
13580 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28  ndif..    while(
13590 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53   nRem>0 ){.#if S
135a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
135b0 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
135c0 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
135d0 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
135e0 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ite, 0) ){.#else
135f0 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
13600 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
13610 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
13620 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70  Write, &overlapp
13630 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  ed) ){.#endif.  
13640 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74        if( winRet
13650 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
13660 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
13670 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13680 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57        assert( nW
136a0 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
136b0 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  e<=(DWORD)nRem )
136c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
136d0 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e  te==0 || nWrite>
136e0 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20  (DWORD)nRem ){. 
136f0 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
13700 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13710 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
13720 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  ak;.      }.#if 
13730 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
13740 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
13750 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
13760 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13770 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
13780 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
13790 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
137a0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
137b0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
137c0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
137d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
137e0 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
137f0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
13800 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
13810 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
13820 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13830 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
13840 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
13850 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
13860 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
13870 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13880 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
13890 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
138a0 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
138b0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
138c0 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
138d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
138e0 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
138f0 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
13900 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13910 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
13920 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
13930 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13940 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
13960 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
13970 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
13980 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
13990 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
139a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
139b0 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  E\n", pFile->h))
139c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
139d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
139e0 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
139f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32        "winWrite2
13a20 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
13a40 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
13a50 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
13a60 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
13a70 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13a80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
13ab0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
13ac0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
13ad0 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
13ae0 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
13af0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13b00 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
13b10 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
13b20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
13b30 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
13b40 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
13b50 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
13b60 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13b70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13b80 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
13b90 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
13ba0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
13bb0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13bc0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
13bd0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
13be0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
13bf0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
13c00 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
13c10 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
13c20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
13c30 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
13c40 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
13c50 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
13c60 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
13c70 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
13c80 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
13c90 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
13ca0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
13cb0 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
13cc0 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
13cd0 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
13ce0 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
13cf0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
13d00 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
13d10 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
13d20 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
13d30 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
13d40 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
13d50 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
13d60 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
13d70 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
13d80 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
13d90 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
13da0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
13db0 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
13dc0 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
13dd0 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
13de0 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
13df0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
13e00 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
13e10 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
13e20 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
13e30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
13e40 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
13e50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
13e80 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
13e90 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
13ea0 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
13eb0 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
13ec0 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
13ed0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13ee0 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
13ef0 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
13f00 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
13f10 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
13f20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
13f30 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13f40 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
13f50 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
13f60 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13f70 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
13f80 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
13f90 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
13fa0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
13fb0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
13fc0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
13fd0 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
13fe0 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
13ff0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
14000 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
14010 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
14020 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
14030 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
14040 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
14050 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
14060 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
14070 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
14080 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
14090 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
140a0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
140b0 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
140c0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
140d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
140e0 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
140f0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
14100 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
14110 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
14120 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
14130 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
14140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14150 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
14160 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
14170 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
14180 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
14190 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
141a0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
141b0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
141c0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
141d0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
141e0 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
141f0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
14200 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
14210 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
14220 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
14230 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14240 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
14250 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
14260 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
14270 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
14280 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
14290 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
142a0 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
142b0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
142c0 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
142d0 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
142e0 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
142f0 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
14300 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
14310 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
14320 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
14330 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
14340 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
14350 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
14360 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14370 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
14380 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
14390 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
143a0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
143b0 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
143c0 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
143d0 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
143e0 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
143f0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
14400 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
14410 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14420 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
14430 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14440 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
14450 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
14460 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
14470 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
14480 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
14490 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
144a0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
144b0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
144c0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
144d0 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
144e0 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
144f0 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
14500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
14510 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
14520 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
14530 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
14540 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
14550 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
14560 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
14570 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
14580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
14590 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
145a0 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
145b0 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
145c0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
145d0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
145e0 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
145f0 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
14600 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
14610 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
14620 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
14630 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
14640 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
14650 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14660 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
14670 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14680 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
14690 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
146a0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
146b0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
146c0 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
146d0 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
146e0 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
146f0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
14700 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14710 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
14720 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
14730 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
14740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
14750 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
14760 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
14770 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
14780 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
14790 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
147a0 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
147b0 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
147c0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
147d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
147e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
147f0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
14800 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14810 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14820 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
14830 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
14840 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14850 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
14860 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
14870 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
14880 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
14890 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
148a0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
148b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
148c0 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
148d0 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
148e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
148f0 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
14900 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
14910 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
14920 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
14930 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14940 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
14950 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
14960 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14970 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
14980 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14990 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
149a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
149b0 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
149c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
149d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
149e0 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
149f0 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
14a00 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
14a10 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
14a20 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
14a30 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
14a40 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
14a50 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
14a60 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
14a70 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
14a80 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
14a90 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
14ad0 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
14ae0 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
14af0 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
14b00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14b10 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14b20 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
14b30 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
14b40 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
14b50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
14b60 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
14b70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14b80 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14b90 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
14ba0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
14bb0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
14bc0 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
14bd0 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
14be0 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
14bf0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
14c00 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
14c10 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
14c20 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
14c30 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
14c40 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
14c50 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
14c60 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
14c70 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
14c80 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
14c90 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
14ca0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
14cb0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14cc0 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
14cd0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
14ce0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
14cf0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
14d00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14d10 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
14d20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14d40 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
14d50 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
14d60 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
14d70 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
14d80 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
14d90 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
14da0 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
14db0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
14dc0 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
14dd0 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
14de0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
14df0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14e00 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
14e10 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
14e20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
14e30 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
14e40 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
14e50 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
14e60 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
14e70 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
14e80 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
14e90 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
14ea0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
14eb0 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
14ec0 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
14ed0 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
14ee0 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
14ef0 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
14f00 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
14f10 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
14f20 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
14f30 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
14f40 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
14f50 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
14f60 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
14f70 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
14f80 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
14f90 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
14fa0 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
14fb0 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
14fc0 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
14fd0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
14fe0 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
14ff0 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
15000 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
15010 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
15020 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
15030 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
15040 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
15050 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
15060 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15070 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
15080 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
15090 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
150a0 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
150b0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
150c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
150f0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
15100 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
15110 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
15120 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
15130 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
15140 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
15150 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
15160 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
15170 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
15180 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
15190 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
151a0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
151b0 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
151c0 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
151d0 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
151e0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
151f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
15200 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
15210 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
15220 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
15230 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
15240 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
15250 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
15260 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
15270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15280 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
15290 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
152a0 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
152b0 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
152c0 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
152d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
152e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
152f0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
15300 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
15310 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
15320 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
15330 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
15340 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
15350 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
15360 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
15370 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
15380 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
15390 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
153a0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
153b0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
153c0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
153d0 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
153e0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
153f0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
15400 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
15410 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
15440 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
15450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
15460 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
15470 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
15480 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
15490 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
154a0 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
154b0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
154c0 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
154d0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
154e0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
154f0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
15500 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15510 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
15520 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
15550 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15560 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15570 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15580 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
15590 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
155a0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
155b0 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
155c0 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
155d0 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
155e0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
155f0 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
15600 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
15610 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
15620 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20  rName(res)));.  
15630 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
15640 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
15650 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
15660 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64  nt winUnlockRead
15670 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
15680 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
15690 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
156a0 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  no;.  OSTRACE(("
156b0 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
156c0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
156d0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
156e0 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
156f0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
15700 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
15710 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15720 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
15730 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
15740 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20   0);.  }.#ifdef 
15750 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
15760 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
15770 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
15780 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15790 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
157a0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
157b0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
157c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
157d0 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74  res==0 && ((last
157e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
157f0 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
15800 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a  _NOT_LOCKED) ){.
15810 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15820 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
15830 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
15840 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
15850 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  NLOCK, pFile->la
15860 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
15870 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
15880 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
15890 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
158a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
158b0 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
158c0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
158d0 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
158e0 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20 72  Name(res)));.  r
158f0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
15900 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
15910 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
15920 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
15930 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
15940 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
15950 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15960 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
15970 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
15980 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
15990 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
159a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
159b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
159c0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
159d0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
159e0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
159f0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
15a00 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
15a10 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
15a20 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
15a30 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
15a40 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
15a50 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
15a60 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
15a70 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
15a80 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
15a90 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
15aa0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
15ab0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
15ac0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
15ad0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
15ae0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
15af0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
15b00 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
15b10 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
15b20 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
15b30 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
15b40 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
15b50 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
15b60 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
15b70 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
15b80 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
15b90 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
15ba0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
15bb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15bc0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
15bd0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
15be0 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
15bf0 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
15c00 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
15c10 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
15c20 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
15c30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
15c40 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
15c50 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
15c60 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15c70 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
15c80 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
15c90 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
15ca0 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
15cb0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
15cc0 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
15cd0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15ce0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
15cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15d00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15d10 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
15d20 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
15d30 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
15d40 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
15d50 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
15d60 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
15d70 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
15d80 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
15d90 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
15da0 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
15db0 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
15dc0 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
15dd0 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
15de0 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
15df0 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
15e00 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
15e10 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
15e20 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
15e30 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
15e40 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
15e50 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
15e60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
15e70 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
15e80 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
15e90 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
15ea0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15eb0 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
15ec0 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
15ed0 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
15ee0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15ef0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
15f00 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
15f10 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
15f20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
15f30 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
15f40 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
15f50 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
15f60 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
15f70 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
15f80 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
15f90 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
15fa0 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
15fb0 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
15fc0 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20  ACE(("LOCK-HELD 
15fd0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15fe0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
15ff0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
16000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16010 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16020 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
16030 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
16040 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16050 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
16060 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
16070 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
16090 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
160a0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
160b0 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
160c0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
160d0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
160e0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
160f0 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
16100 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
16110 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
16120 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
16130 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
16140 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
16150 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
16160 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
16170 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
16180 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
16190 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
161a0 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
161b0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
161c0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
161d0 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
161e0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
161f0 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
16200 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
16210 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
16220 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
16230 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
16240 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
16250 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
16260 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
16270 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
16280 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
16290 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
162a0 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
162e0 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
162f0 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
16300 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
16310 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
16320 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
16330 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
16340 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
16350 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
16360 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
16370 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
16380 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
16390 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
163a0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
163b0 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
163c0 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
163d0 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
163e0 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
163f0 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
16400 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
16410 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
16420 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
16430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
16440 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45  STRACE(("LOCK-PE
16450 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d  NDING-FAIL file=
16460 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63  %p, count=%d, rc
16470 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
16480 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16490 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72   cnt, sqlite3Err
164a0 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20 20  Name(res)));.   
164b0 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c     if( cnt ) sql
164c0 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
164d0 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  (1);.    }.    g
164e0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
164f0 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65  res;.    if( !re
16500 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  s ){.      lastE
16510 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
16520 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
16530 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
16540 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
16550 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16560 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16570 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
16580 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
16590 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
165a0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47  ;.    res = winG
165b0 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
165c0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
165d0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
165e0 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
165f0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
16600 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
16610 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16630 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
16640 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
16650 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
16660 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
16670 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
16680 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
16690 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
166a0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
166b0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
166c0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
166d0 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52  ILE_FLAGS, RESER
166e0 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
166f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
16700 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
16710 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
16720 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
16730 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
16740 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16750 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
16760 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50    /* Acquire a P
16770 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f  ENDING lock.  */
16780 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
16790 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
167a0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65  && res ){.    ne
167b0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  wLocktype = PEND
167c0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f  ING_LOCK;.    go
167d0 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
167e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
167f0 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
16800 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
16810 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
16820 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
16830 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16840 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
16850 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16860 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
16870 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
16880 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  e);.    res = wi
16890 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
168a0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
168b0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
168c0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
168f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
16900 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
16910 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
16920 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
16930 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
16940 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
16950 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47  or();.      winG
16960 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
16970 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16980 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
16990 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
169a0 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
169b0 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
169c0 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
169d0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
169e0 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
169f0 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
16a00 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
16a10 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
16a20 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
16a30 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
16a40 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
16a50 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
16a60 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
16a70 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
16a80 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
16a90 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
16aa0 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
16ab0 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
16ac0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
16ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
16af0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
16b00 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
16b10 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16b20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16b30 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  CK-FAIL file=%p,
16b40 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d   wanted=%d, got=
16b50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
16b60 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
16b70 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
16b80 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69  ype));.  }.  pFi
16b90 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
16ba0 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a  u8)newLocktype;.
16bb0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16bc0 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
16bd0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
16be0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16bf0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16c00 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
16c10 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
16c20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
16c30 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
16c40 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
16c50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
16c60 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
16c70 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
16c80 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
16c90 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
16ca0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
16cb0 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
16cc0 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
16cd0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
16ce0 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
16cf0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
16d00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16d10 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
16d20 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
16d30 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
16d40 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
16d50 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
16d60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
16d70 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
16d80 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16d90 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
16da0 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
16db0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16dc0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73  ResOut));..  ass
16dd0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
16de0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
16df0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
16e00 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
16e10 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
16e20 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
16e30 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c 6f 63  e=%p, rc=%d (loc
16e40 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  al)\n", pFile->h
16e50 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  , rc));.  }else{
16e60 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
16e70 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16e80 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16e90 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45  EX_FLAGS,RESERVE
16ea0 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
16eb0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
16ec0 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46        winUnlockF
16ed0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
16ee0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
16ef0 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
16f00 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20    rc = !rc;.    
16f10 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
16f20 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
16f30 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  rc=%d (remote)\n
16f40 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
16f50 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
16f60 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
16f70 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
16f80 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
16f90 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
16fa0 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
16fb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
16fc0 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74  File->h, pResOut
16fd0 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
16fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
17000 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17010 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
17020 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b  iptor id to lock
17030 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
17040 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17050 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
17060 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
17070 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
17080 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
17090 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
170a0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
170b0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
170c0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
170d0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
170e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
170f0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
17100 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
17110 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66  utine to fail if
17120 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17130 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f  ment.** is NO_LO
17140 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  CK.  If the seco
17150 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
17160 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20  HARED_LOCK then 
17170 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
17180 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
17190 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74  ITE_IOERR;.*/.st
171a0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
171b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
171c0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
171d0 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a  e){.  int type;.
171e0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
171f0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
17200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17210 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
17220 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
17230 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
17240 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17250 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
17260 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c  CK file=%p, oldL
17270 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c  ock=%d(%d), newL
17280 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
17290 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
172a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
172b0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
172c0 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65  ckByte, locktype
172d0 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
172e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
172f0 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
17300 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
17310 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17320 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
17330 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
17340 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
17350 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
17360 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e  RED_LOCK && !win
17370 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
17380 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
17390 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
173a0 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
173b0 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
173c0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
173d0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
173e0 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
173f0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
17400 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
17410 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOCK, osGetLastE
17420 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17440 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c  winUnlock", pFil
17450 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
17460 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
17470 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
17480 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
17490 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
174a0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
174b0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
174c0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
174d0 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
174e0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
174f0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17500 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
17510 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
17520 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  G_LOCK ){.    wi
17530 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17540 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
17550 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17560 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
17570 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  type = (u8)lockt
17580 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
17590 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
175a0 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
175b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
175c0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
175d0 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
175e0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
175f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17600 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
17610 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65  s inititially ne
17620 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
17630 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
17640 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
17650 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
17660 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
17670 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
17680 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
17690 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
176a0 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
176b0 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
176c0 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
176d0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
176e0 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
176f0 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69  id winModeBit(wi
17700 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  nFile *pFile, un
17710 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
17720 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
17730 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
17740 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
17750 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
17760 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
17770 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
17780 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
17790 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
177a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
177b0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
177c0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
177d0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
177e0 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
177f0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
17800 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
17810 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
17820 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
17830 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
17840 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69   char **);.stati
17850 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
17860 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74  onst void *);.st
17870 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
17880 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
17890 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  on(const char *)
178a0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c  ;../*.** Control
178b0 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68   and query of th
178c0 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  e open file hand
178d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
178e0 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c  t winFileControl
178f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17900 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
17910 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c  *pArg){.  winFil
17920 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
17930 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41  ile*)id;.  OSTRA
17940 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
17950 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d  %p, op=%d, pArg=
17960 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
17970 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73   op, pArg));.  s
17980 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
17990 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
179a0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
179b0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
179c0 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
179d0 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ype;.      OSTRA
179e0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
179f0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
17a00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
17a10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
17a30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
17a40 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
17a50 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
17a60 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
17a70 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
17a80 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
17a90 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17aa0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
17ab0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
17ac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17ad0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
17ae0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
17af0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
17b00 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
17b10 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
17b20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
17b30 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
17b40 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
17b50 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
17b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17b70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
17b80 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
17b90 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
17ba0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
17bb0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
17bc0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
17bd0 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
17be0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
17bf0 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
17c00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17c10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17c20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
17c30 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
17c40 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
17c50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
17c60 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
17c70 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
17c80 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
17c90 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17ca0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
17cb0 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
17cc0 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
17cd0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17d00 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
17d10 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
17d20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
17d30 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
17d40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
17d50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
17d60 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
17d70 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
17d80 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
17d90 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
17da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17db0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
17dc0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
17dd0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
17de0 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
17df0 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
17e00 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
17e10 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
17e20 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
17e30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17e40 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
17e50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
17e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17e70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
17e80 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
17e90 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
17ea0 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
17eb0 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
17ec0 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
17ed0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
17ee0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
17ef0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17f00 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17f20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
17f30 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
17f40 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
17f50 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
17f60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17f70 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
17f80 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
17f90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17fa0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17fb0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
17fc0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
17fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17ff0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
18000 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
18010 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
18020 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
18030 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
18040 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
18050 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
18060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18070 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
18080 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
18090 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
180a0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
180b0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
180c0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
180d0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
180e0 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
180f0 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
18100 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18110 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18120 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18130 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18150 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18160 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
18170 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
18180 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
18190 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
181a0 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
181b0 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
181c0 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
181d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
181e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
181f0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
18200 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
18210 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18220 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18230 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
18240 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
18250 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
18260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
18270 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
18280 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
18290 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
182a0 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
182b0 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
182c0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
182d0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
182e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
182f0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
18300 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18310 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
18320 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
18330 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18340 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
18350 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
18360 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
18370 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
18380 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
18390 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
183a0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
183b0 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
183c0 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
183d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
183e0 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
183f0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
18400 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
18410 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e  .          winUn
18420 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
18430 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
18440 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  inMapfile(pFile,
18450 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
18460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
18470 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18480 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
18490 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
184a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
184b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
184c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
184d0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46   }.  OSTRACE(("F
184e0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
184f0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
18500 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18520 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
18530 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
18540 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
18550 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
18560 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
18570 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
18580 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
18590 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
185a0 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
185b0 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
185c0 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
185d0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
185e0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
185f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
18600 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
18610 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
18620 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
18630 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
18640 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
18650 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
18660 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
18670 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
18680 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
18690 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
186a0 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
186b0 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
186c0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
186d0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
186e0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
186f0 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
18700 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
18710 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
18720 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
18730 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
18740 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
18750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18760 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
18770 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
18780 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
18790 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
187a0 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
187b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
187c0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
187d0 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
187e0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
187f0 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
18800 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
18810 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
18820 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f  .}../* .** Windo
18830 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
18840 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
18850 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
18860 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
18870 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
18880 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
18890 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
188a0 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
188b0 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
188c0 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
188d0 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
188e0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45  .*/.static SYSTE
188f0 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
18900 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
18910 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
18920 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
18930 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
18940 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
18950 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
18960 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
18970 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
18980 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
18990 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
189a0 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66  ed by .** this f
189b0 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
189c0 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  h may be shared 
189d0 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
189e0 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
189f0 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  ion winShmMutexH
18a00 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
18a10 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
18a20 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
18a30 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
18a40 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
18a50 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
18a60 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
18a70 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
18a80 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
18a90 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
18aa0 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
18ab0 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
18ac0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
18ad0 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
18ae0 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
18af0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
18b00 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
18b10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
18b20 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
18b30 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
18b40 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
18b50 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
18b60 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
18b70 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
18b80 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
18b90 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
18ba0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
18bb0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
18bc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18bd0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
18be0 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
18bf0 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
18c00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
18c10 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
18c20 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
18c30 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
18c40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
18c50 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
18c60 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
18c70 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
18c80 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
18c90 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
18ca0 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
18cb0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
18cc0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
18cd0 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
18ce0 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
18cf0 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
18d00 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
18d10 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
18d20 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
18d30 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
18d40 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
18d50 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
18d60 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
18d70 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
18d80 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
18d90 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
18da0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
18db0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
18dc0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
18dd0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
18de0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
18df0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
18e00 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
18e10 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
18e20 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
18e30 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
18e40 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
18e50 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
18e60 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
18e70 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
18e80 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
18e90 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
18ea0 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
18eb0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
18ec0 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
18ed0 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
18ee0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
18ef0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
18f00 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
18f10 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
18f20 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
18f30 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
18f40 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
18f50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
18f60 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
18f70 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
18f80 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
18f90 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18fa0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
18fb0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
18fc0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
18fd0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
18fe0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
18ff0 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
19000 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19020 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
19030 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
19040 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19060 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
19070 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
19080 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
19090 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190b0 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
190c0 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
190d0 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
190e0 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
190f0 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
19100 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
19110 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
19120 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
19130 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
19140 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
19170 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
19180 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
19190 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
191a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
191b0 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
191c0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
191d0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
191e0 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
191f0 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
19200 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
19210 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
19220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19230 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
19240 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
19250 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
19260 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
19270 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
19280 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
19290 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
192a0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
192b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
192c0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
192d0 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
192e0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
192f0 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
19300 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
19310 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
19320 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
19330 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
19340 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
19350 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
19360 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
19370 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
19380 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
19390 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
193a0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
193b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
193c0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
193d0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
193e0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
193f0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
19400 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
19410 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
19420 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
19430 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
19440 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
19450 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
19460 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
19470 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
19480 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
19490 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
194a0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
194b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
194c0 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
194d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
194e0 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
194f0 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
19500 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
19510 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
19520 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
19530 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
19540 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
19550 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19560 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
19570 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
19580 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
19590 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
195a0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
195b0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
195c0 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195e0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
195f0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
19600 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19610 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
19640 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
19650 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
19660 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
19670 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
19680 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
19690 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
196a0 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
196b0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
196c0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
196d0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
196e0 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
196f0 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
19700 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
19710 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
19720 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
19730 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
19740 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
19750 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
19760 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
19770 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
19780 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
19790 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
197a0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
197b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
197c0 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
197d0 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
197e0 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
197f0 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
19800 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
19810 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
19820 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
19830 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
19840 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
19850 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
19860 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
19870 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
19880 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
19890 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
198a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
198b0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
198c0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
198d0 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
198e0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
198f0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
19900 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
19910 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
19920 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
19930 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
19940 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
19950 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
19960 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
19970 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19980 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
19990 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ile->mutex) || p
199a0 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  File->nRef==0 );
199b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
199c0 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
199d0 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d  lock=%d, offset=
199e0 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a  %d, size=%d\n",.
199f0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19a00 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54  ->hFile.h, lockT
19a10 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65  ype, ofst, nByte
19a20 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  ));..  /* Releas
19a30 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
19a40 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
19a50 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
19a60 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
19a70 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
19a80 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19a90 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30  hFile.h, ofst, 0
19aa0 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
19ab0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
19ac0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
19ad0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
19ae0 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c  /.    DWORD dwFl
19af0 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
19b00 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
19b10 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
19b20 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  e == _SHM_WRLCK 
19b30 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43  ) dwFlags |= LOC
19b40 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
19b50 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77  LOCK;.    rc = w
19b60 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
19b70 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
19b80 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  ags, ofst, 0, nB
19b90 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a  yte, 0);.  }.  .
19ba0 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
19bb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19bc0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
19bd0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19be0 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
19bf0 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
19c00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
19c10 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
19c20 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
19c30 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25  func=%s, errno=%
19c40 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  lu, rc=%s\n",.  
19c50 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19c60 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79  hFile.h, (lockTy
19c70 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b  pe == _SHM_UNLCK
19c80 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69  ) ? "winUnlockFi
19c90 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20  le" :.          
19ca0 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20   "winLockFile", 
19cb0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19cc0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
19cd0 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  (rc)));..  retur
19ce0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
19cf0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
19d00 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
19d10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
19d20 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
19d30 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
19d40 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
19d50 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
19d60 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
19d70 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
19d80 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
19d90 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
19da0 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
19db0 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
19dc0 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
19dd0 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
19de0 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
19df0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
19e00 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
19e10 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
19e20 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
19e30 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
19e40 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
19e50 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
19e60 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
19e70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
19e80 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
19e90 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
19ea0 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65  mNode *p;.  asse
19eb0 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
19ec0 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41  eld() );.  OSTRA
19ed0 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70  CE(("SHM-PURGE p
19ee0 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c  id=%lu, deleteFl
19ef0 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ag=%d\n",.      
19f00 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
19f10 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65  tProcessId(), de
19f20 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70  leteFlag));.  pp
19f30 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69   = &winShmNodeLi
19f40 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20  st;.  while( (p 
19f50 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20  = *pp)!=0 ){.   
19f60 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
19f70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
19f80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74        if( p->mut
19f90 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75  ex ){ sqlite3_mu
19fa0 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
19fb0 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28  x); }.      for(
19fc0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
19fd0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
19fe0 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e   BOOL bRc = osUn
19ff0 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d  mapViewOfFile(p-
1a000 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70  >aRegion[i].pMap
1a010 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1a020 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55  CE(("SHM-PURGE-U
1a030 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  NMAP pid=%lu, re
1a040 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1a050 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a060 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1a070 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1a080 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1a090 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1a0a0 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1a0b0 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1a0c0 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
1a0d0 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
1a0e0 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
1a0f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a100 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20  SHM-PURGE-CLOSE 
1a110 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1a120 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1a140 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1a150 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
1a160 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1a170 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53  ));.        UNUS
1a180 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55  ED_VARIABLE_VALU
1a190 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a  E(bRc);.      }.
1a1a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69        if( p->hFi
1a1b0 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d  le.h!=NULL && p-
1a1c0 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49  >hFile.h!=INVALI
1a1d0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
1a1e0 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
1a1f0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a200 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43  1);.        winC
1a210 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
1a220 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b  le *)&p->hFile);
1a230 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1a240 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1a250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a260 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
1a270 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1a280 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a290 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (1);.        sql
1a2a0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
1a2b0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1a2c0 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c   winDelete(pVfs,
1a2d0 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   p->zFilename, 0
1a2e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a2f0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
1a300 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  c();.        Sim
1a310 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a320 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1a330 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e       *pp = p->pN
1a340 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1a350 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69  e3_free(p->aRegi
1a360 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
1a370 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1a380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20  }else{.      pp 
1a390 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = &p->pNext;.   
1a3a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a3b0 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d  Open the shared-
1a3c0 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
1a3d0 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ciated with data
1a3e0 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
1a3f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
1a400 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
1a410 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
1a420 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
1a430 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
1a440 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
1a450 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
1a460 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
1a470 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
1a480 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
1a490 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
1a4a0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
1a4b0 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
1a4c0 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  der cleared..*/.
1a4d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
1a4e0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77  enSharedMemory(w
1a4f0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  inFile *pDbFd){.
1a500 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20    struct winShm 
1a510 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1a520 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1a530 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
1a540 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1a550 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1a560 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54  Node = 0;   /* T
1a570 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1a580 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1a590 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5b0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a5c0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  e */.  struct wi
1a5d0 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20  nShmNode *pNew; 
1a5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1a5f0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e  ly allocated win
1a600 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ShmNode */.  int
1a610 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65  /* Size of zName
1a640 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1a650 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
1a660 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  Shm==0 );    /* 
1a670 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  Not previously o
1a680 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  pened */..  /* A
1a690 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1a6a0 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  r the new sqlite
1a6b0 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41  3_shm object.  A
1a6c0 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c  lso speculativel
1a6d0 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20  y.  ** allocate 
1a6e0 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1a6f0 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66  winShmNode and f
1a700 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ilename..  */.  
1a710 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
1a720 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1a730 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
1a740 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a750 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e  IOERR_NOMEM;.  n
1a760 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1a770 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
1a780 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
1a790 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1a7a0 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
1a7b0 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
1a7c0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1a7d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1a7e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
1a7f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a800 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  R_NOMEM;.  }.  p
1a810 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
1a820 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
1a830 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1a840 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70  intf(nName+15, p
1a850 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  New->zFilename, 
1a860 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1a870 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74  >zPath);.  sqlit
1a880 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
1a890 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77  bFd->zPath, pNew
1a8a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a  ->zFilename); ..
1a8b0 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65    /* Look to see
1a8c0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1a8d0 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e  existing winShmN
1a8e0 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ode that can be 
1a8f0 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f  used..  ** If no
1a900 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d   matching winShm
1a910 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65  Node currently e
1a920 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20  xists, create a 
1a930 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
1a940 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1a950 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f  ();.  for(pShmNo
1a960 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  de = winShmNodeL
1a970 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70  ist; pShmNode; p
1a980 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65  ShmNode=pShmNode
1a990 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
1a9a0 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d   TBD need to com
1a9b0 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72  e up with better
1a9c0 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65   match here.  Pe
1a9d0 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65  rhaps.    ** use
1a9e0 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49   FILE_ID_BOTH_DI
1a9f0 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65  R_INFO Structure
1aa00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1aa10 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1aa20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1aa30 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ame, pNew->zFile
1aa40 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  name)==0 ) break
1aa50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
1aa60 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Node ){.    sqli
1aa70 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
1aa80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68    }else{.    pSh
1aa90 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20  mNode = pNew;.  
1aaa0 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
1aab0 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68  ((winFile*)(&pSh
1aac0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e  mNode->hFile))->
1aad0 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
1aae0 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53  LE_VALUE;.    pS
1aaf0 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20  hmNode->pNext = 
1ab00 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
1ab10 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69      winShmNodeLi
1ab20 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a  st = pShmNode;..
1ab30 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1ab40 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1ab50 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1ab60 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1ab70 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1ab80 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1ab90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1aba0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1abb0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1abc0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
1abd0 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
1abe0 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20  d->pVfs,.       
1abf0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1ac00 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  de->zFilename,  
1ac10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1ac20 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
1ac30 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20  UTF-8) */.      
1ac40 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1ac50 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e  te3_file*)&pShmN
1ac60 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20  ode->hFile,  /* 
1ac70 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  File handle here
1ac80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ac90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1aca0 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _WAL | SQLITE_OP
1acb0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1acc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1acd0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
1ace0 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
1acf0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
1ad00 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1ad10 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1ad20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1ad30 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1ad40 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1ad50 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1ad60 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1ad70 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1ad80 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1ad90 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
1ada0 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
1adb0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1adc0 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
1add0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
1ade0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1adf0 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
1ae00 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1ae10 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
1ae20 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
1ae30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ae40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1ae50 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1ae60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1ae70 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
1ae80 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44  "winOpenShm", pD
1aeb0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1aec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1aed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aee0 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   ){.      winShm
1aef0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1af00 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1af10 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1af20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1af30 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1af40 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
1af50 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1af60 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1af70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
1af80 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1af90 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1afa0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1afb0 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
1afc0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1afd0 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1afe0 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
1aff0 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
1b000 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
1b010 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
1b020 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1b030 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
1b040 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c  m = p;.  winShmL
1b050 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1b060 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
1b070 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
1b080 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
1b090 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
1b0a0 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
1b0b0 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53  over of the winS
1b0c0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  hmEnterMutex() m
1b0d0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
1b0e0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
1b0f0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77  ** new (struct w
1b100 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  inShm) object to
1b110 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
1b120 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
1b130 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
1b140 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
1b150 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
1b160 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
1b170 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
1b180 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
1b190 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
1b1a0 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
1b1b0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
1b1c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
1b1d0 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1b1e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b1f0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1b200 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1b210 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1b220 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1b230 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1b240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b250 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1b260 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1b270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1b280 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1b290 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1b2a0 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
1b2b0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1b2c0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1b2d0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1b2e0 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
1b2f0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
1b300 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
1b310 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1b320 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1b330 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1b340 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
1b350 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
1b360 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1b370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b380 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1b390 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
1b3a0 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
1b3b0 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
1b3c0 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
1b3d0 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
1b3e0 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
1b3f0 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28  int winShmUnmap(
1b400 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1b410 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1b420 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1b430 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1b440 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
1b450 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1b460 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20  /* Delete after 
1b470 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20  closing if true 
1b480 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1b490 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a  *pDbFd;       /*
1b4a0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1b4b0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1b4c0 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20  */.  winShm *p; 
1b4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b4e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1b4f0 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77  be closed */.  w
1b500 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1b510 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1b520 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1b530 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
1b540 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  inShm **pp;     
1b550 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1b560 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
1b570 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1b580 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
1b590 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
1b5a0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
1b5b0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1b5c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
1b5d0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1b5e0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ode;..  /* Remov
1b5f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
1b600 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
1b610 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
1b620 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
1b630 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
1b640 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b650 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1b660 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
1b670 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1b680 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
1b690 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
1b6a0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1b6b0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
1b6c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
1b6d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b6e0 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
1b6f0 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
1b700 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1b710 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
1b720 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
1b730 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
1b740 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
1b750 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1b760 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
1b770 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
1b780 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1b790 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
1b7a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
1b7b0 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
1b7c0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
1b7d0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
1b7e0 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72  ){.    winShmPur
1b7f0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1b800 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d  deleteFlag);.  }
1b810 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1b820 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1b830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b840 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1b850 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
1b860 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1b870 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
1b880 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b  c int winShmLock
1b890 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1b8a0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1b8b0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
1b8c0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
1b8d0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1b8e0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1b8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1b900 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
1b910 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
1b920 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b940 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
1b950 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1b960 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1b970 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1b980 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
1b990 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
1b9a0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ck */.){.  winFi
1b9b0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1b9c0 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20  File*)fd;       
1b9d0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1b9e0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1b9f0 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1ba00 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1ba10 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1ba20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
1ba30 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
1ba40 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  d */.  winShm *p
1ba50 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba70 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1ba80 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
1ba90 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1baa0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1bab0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1bac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bae0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1baf0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1bb20 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
1bb30 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1bb40 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
1bb50 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
1bb60 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1bb70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
1bb80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
1bb90 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1bba0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1bbb0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1bbc0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1bbd0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
1bbe0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1bbf0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
1bc00 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1bc10 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
1bc20 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1bc30 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1bc40 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1bc50 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1bc60 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
1bc70 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
1bc80 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1bc90 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
1bca0 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75   );..  mask = (u
1bcb0 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e  16)((1U<<(ofst+n
1bcc0 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29  )) - (1U<<ofst))
1bcd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
1bce0 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
1bcf0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
1bd00 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1bd10 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bd20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1bd30 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
1bd40 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
1bd50 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
1bd60 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
1bd70 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
1bd80 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
1bd90 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
1bda0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
1bdb0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1bdc0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1bdd0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1bde0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
1bdf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1be00 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
1be10 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
1be20 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
1be30 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
1be40 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
1be50 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1be60 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
1be70 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1be80 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1be90 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
1bea0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1beb0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1bec0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1bed0 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  _SHM_UNLCK, ofst
1bee0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1bef0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bf00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bf10 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
1bf20 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
1bf30 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1bf40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
1bf60 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1bf70 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1bf80 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1bf90 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
1bfa0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1bfb0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
1bfc0 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
1bfd0 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
1bfe0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
1bff0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
1c000 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
1c010 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
1c020 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
1c030 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
1c040 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
1c050 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
1c060 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
1c070 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
1c080 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
1c090 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
1c0a0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
1c0b0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
1c0c0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1c0d0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1c0e0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1c0f0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1c100 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1c110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1c120 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1c130 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
1c150 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
1c160 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1c170 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
1c180 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
1c190 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
1c1a0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1c1b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c1c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1c1d0 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
1c1e0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1c1f0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1c200 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1c210 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66  , _SHM_RDLCK, of
1c220 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1c230 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
1c240 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c260 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c270 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
1c280 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
1c290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1c2b0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1c2c0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1c2d0 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
1c2e0 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
1c2f0 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
1c300 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
1c310 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
1c320 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
1c330 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
1c340 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
1c350 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1c360 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1c370 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1c380 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c390 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1c3a0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
1c3b0 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
1c3c0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1c3d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c3e0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1c3f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c400 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
1c410 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
1c420 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1c430 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
1c440 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
1c450 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
1c460 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
1c470 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
1c480 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
1c490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c4a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1c4b0 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1c4c0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1c4d0 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_WRLCK, ofst+WI
1c4e0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1c4f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c510 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
1c520 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1c530 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1c540 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
1c550 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
1c560 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1c570 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1c580 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1c590 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1c5a0 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d  OCK pid=%lu, id=
1c5b0 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25  %d, sharedMask=%
1c5c0 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30  03x, exclMask=%0
1c5d0 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  3x, rc=%s\n",.  
1c5e0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c5f0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c600 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72  , p->id, p->shar
1c610 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
1c620 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
1c630 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1c640 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
1c650 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
1c660 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
1c670 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
1c680 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
1c690 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
1c6a0 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
1c6b0 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
1c6c0 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
1c6d0 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
1c6e0 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
1c6f0 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
1c700 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
1c710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c720 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a   winShmBarrier(.
1c730 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1c740 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  fd          /* D
1c750 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1c760 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1c770 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
1c780 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1c790 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69    /* MemoryBarri
1c7a0 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f  er(); // does no
1c7b0 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74  t work -- do not
1c7c0 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f   know why not */
1c7d0 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1c7e0 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  tex();.  winShmL
1c7f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
1c800 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c810 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1c820 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
1c830 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
1c840 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
1c850 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
1c860 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1c870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1c880 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
1c890 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
1c8a0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
1c8b0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
1c8c0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
1c8d0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
1c8e0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
1c8f0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
1c900 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1c910 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1c920 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1c930 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1c940 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
1c950 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69  se, if the isWri
1c960 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  te parameter is 
1c970 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
1c980 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1c990 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
1c9a0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1c9b0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
1c9c0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
1c9d0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
1c9e0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1c9f0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
1ca00 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1ca10 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1ca20 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69  ed. If .** isWri
1ca30 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  te is non-zero a
1ca40 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1ca50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ca60 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
1ca70 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
1ca80 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
1ca90 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
1caa0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1cab0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1cac0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
1cad0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1cae0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
1caf0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
1cb00 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
1cb10 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
1cb20 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
1cb30 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
1cb40 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
1cb50 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1cb60 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
1cb70 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1cb80 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
1cb90 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
1cba0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
1cbb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1cbc0 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
1cbd0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1cbe0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
1cbf0 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
1cc00 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1cc10 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cc30 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
1cc40 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
1cc50 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1cc60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1cc70 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
1cc80 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20   int isWrite,   
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
1ccb0 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
1ccc0 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
1ccd0 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
1cce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1ccf0 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
1cd00 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1cd10 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c  *pDbFd = (winFil
1cd20 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20  e*)fd;.  winShm 
1cd30 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1cd40 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1cd50 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1cd60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cd70 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
1cd80 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61   rc = winOpenSha
1cd90 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
1cda0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1cdb0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1cdc0 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62   rc;.    p = pDb
1cdd0 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20  Fd->pShm;.  }.  
1cde0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1cdf0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74  hmNode;..  sqlit
1ce00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1ce10 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1ce20 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
1ce30 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
1ce40 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
1ce50 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
1ce60 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1ce70 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1ce80 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75  gion ){.    stru
1ce90 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70  ct ShmRegion *ap
1cea0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1ceb0 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20  * New aRegion[] 
1cec0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
1ced0 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
1cee0 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
1cef0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
1cf00 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1cf10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1cf20 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  64 sz;          
1cf30 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1cf40 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69  nt size of wal-i
1cf50 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  ndex file */..  
1cf60 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
1cf70 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
1cf80 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  ..    /* The req
1cf90 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
1cfa0 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
1cfb0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1cfc0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
1cfd0 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
1cfe0 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
1cff0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
1d000 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
1d010 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  ex file is.    *
1d020 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
1d030 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
1d040 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
1d050 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1d060 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71   winFileSize((sq
1d070 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1d080 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26  hmNode->hFile, &
1d090 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sz);.    if( rc!
1d0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d0b0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1d0c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d0d0 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1d0e0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
1d110 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1d120 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1d130 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
1d140 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
1d150 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1d160 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1d170 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
1d180 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
1d190 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
1d1a0 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
1d1b0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
1d1c0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
1d1d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1d1e0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
1d1f0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
1d200 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
1d210 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1d220 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
1d230 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
1d240 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
1d250 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1d260 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1d270 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
1d280 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
1d290 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
1d2a0 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1d2b0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1d2c0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
1d2d0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
1d2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d2f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1d300 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d310 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1d320 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1d330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d340 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1d350 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap2", pDbFd->z
1d360 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67  Path);.        g
1d370 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1d380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d390 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1d3a0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1d3b0 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1d3c0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1d3d0 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1d3e0 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74   apNew = (struct
1d3f0 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c   ShmRegion *)sql
1d400 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
1d410 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d420 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
1d430 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
1d440 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
1d450 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
1d460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d470 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1d480 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1d490 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1d4a0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1d4b0 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20  n = apNew;..    
1d4c0 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
1d4d0 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1d4e0 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c  n ){.      HANDL
1d4f0 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20  E hMap = NULL;  
1d500 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d         /* file-m
1d510 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f  apping handle */
1d520 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  .      void *pMa
1d530 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1d540 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d     /* Mapped mem
1d550 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ory region */.  
1d560 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f     .#if SQLITE_O
1d570 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1d580 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1d590 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1d5a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1d5b0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1d5c0 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1d5d0 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1d5e0 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1d5f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1d600 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1d610 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1d620 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1d630 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1d640 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
1d650 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1d660 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1d670 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1d680 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d690 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
1d6a0 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1d6b0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1d6c0 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  A(pShmNode->hFil
1d6d0 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
1d6e0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1d6f0 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1d700 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1d710 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
1d720 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45  CE(("SHM-MAP-CRE
1d730 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  ATE pid=%lu, reg
1d740 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c  ion=%d, size=%d,
1d750 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d760 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d770 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d780 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1d790 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20  gion, nByte,.   
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70              hMap
1d7b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1d7c0 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  d"));.      if( 
1d7d0 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  hMap ){.        
1d7e0 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53  int iOffset = pS
1d7f0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a  hmNode->nRegion*
1d800 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20  szRegion;.      
1d810 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
1d820 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
1d830 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
1d840 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
1d850 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  y;.#if SQLITE_OS
1d860 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70  _WINRT.        p
1d870 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  Map = osMapViewO
1d880 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61  fFileFromApp(hMa
1d890 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1d8a0 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1d8b0 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  D,.            i
1d8c0 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
1d8d0 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
1d8e0 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
1d8f0 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
1d900 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
1d910 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68  sMapViewOfFile(h
1d920 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1d930 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1d940 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1d950 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f   0, iOffset - iO
1d960 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
1d970 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
1d980 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
1d990 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53  endif.        OS
1d9a0 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
1d9b0 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  MAP pid=%lu, reg
1d9c0 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ion=%d, offset=%
1d9d0 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
1d9e0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1d9f0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1da00 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1da10 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1da20 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20  n, iOffset,.    
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52               szR
1da40 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f  egion, pMap ? "o
1da50 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1da60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1da70 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20  f( !pMap ){.    
1da80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61      pShmNode->la
1da90 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1daa0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1dab0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1dac0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1dad0 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f  R_SHMMAP, pShmNo
1dae0 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  de->lastErrno,. 
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1db10 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
1db20 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
1db30 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
1db40 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
1db50 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1db60 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
1db70 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1db80 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
1db90 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
1dba0 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
1dbb0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1dbc0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1dbd0 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
1dbe0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1dbf0 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
1dc00 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
1dc10 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
1dc20 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
1dc30 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
1dc40 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
1dc50 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
1dc60 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
1dc70 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
1dc80 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1dc90 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
1dca0 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
1dcb0 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
1dcc0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
1dcd0 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
1dce0 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
1dcf0 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
1dd00 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
1dd10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1dd20 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1dd30 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1dd40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1dd50 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
1dd60 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
1dd70 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
1dd80 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1dd90 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
1dda0 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
1ddb0 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
1ddc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ddd0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
1dde0 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20  * Cleans up the 
1ddf0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66  mapped region of
1de00 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1de10 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ile, if any..*/.
1de20 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1de30 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69  MAP_SIZE>0.stati
1de40 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
1de50 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
1de60 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  e){.  assert( pF
1de70 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52  ile!=0 );.  OSTR
1de80 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45  ACE(("UNMAP-FILE
1de90 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1dea0 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61  %p, hMap=%p, pMa
1deb0 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
1dec0 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69           "mmapSi
1ded0 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  ze=%lld, mmapSiz
1dee0 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d  eActual=%lld, mm
1def0 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e  apSizeMax=%lld\n
1df00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1df10 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1df20 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
1df30 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65  ile->hMap, pFile
1df40 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20  ->pMapRegion,.  
1df50 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1df60 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d  mmapSize, pFile-
1df70 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c  >mmapSizeActual,
1df80 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1df90 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69  Max));.  if( pFi
1dfa0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  le->pMapRegion )
1dfb0 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d  {.    if( !osUnm
1dfc0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
1dfd0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20  le->pMapRegion) 
1dfe0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1dff0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e000 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e010 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e      OSTRACE(("UN
1e020 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e030 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
1e040 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
1e050 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
1e060 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1e070 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  P\n", osGetCurre
1e080 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e090 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
1e0a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70       pFile->pMap
1e0b0 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  Region));.      
1e0c0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
1e0d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e0e0 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
1e0f0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22   "winUnmapfile1"
1e120 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e130 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1e140 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
1e150 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
1e160 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  pSize = 0;.    p
1e170 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
1e180 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tual = 0;.  }.  
1e190 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21  if( pFile->hMap!
1e1a0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
1e1b0 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28   !osCloseHandle(
1e1c0 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a  pFile->hMap) ){.
1e1d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1e1e0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1e1f0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1e200 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1e210 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1e220 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
1e230 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
1e240 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20  R_MMAP\n",.     
1e250 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1e260 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1e270 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
1e280 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72  >hMap));.      r
1e290 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
1e2a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1e2b0 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  MAP, pFile->last
1e2c0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2e0 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c  "winUnmapfile2",
1e2f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1e300 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1e310 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1e320 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  }.  OSTRACE(("UN
1e330 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e340 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1e350 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1e360 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e370 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e380 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75   pFile));.  retu
1e390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e3a0 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61  ./*.** Memory ma
1e3b0 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66  p or remap the f
1e3c0 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69  ile opened by fi
1e3d0 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46  le-descriptor pF
1e3e0 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a  d (if the file.*
1e3f0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70  * is already map
1e400 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e  ped, the existin
1e410 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70  g mapping is rep
1e420 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77  laced by the new
1e430 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68  ). Or, if .** th
1e440 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
1e450 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72  ts a mapping for
1e460 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
1e470 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
1e480 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
1e490 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
1e4a0 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
1e4b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1e4c0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
1e4d0 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
1e4e0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
1e4f0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
1e500 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20  quested size of 
1e510 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20  .** the mapping 
1e520 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72  to create. Other
1e530 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69  wise, if nByte i
1e540 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
1e550 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72  , then the .** r
1e560 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
1e570 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1e580 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
1e590 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
1e5a0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
1e5b0 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
1e5c0 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
1e5d0 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
1e5e0 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a  ue configured .*
1e5f0 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
1e600 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
1e610 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
1e620 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
1e630 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e640 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
1e650 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
1e660 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
1e670 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
1e680 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
1e690 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e6a0 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
1e6b0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
1e6c0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1e6d0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
1e6e0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64  ile(winFile *pFd
1e6f0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1e700 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65  nByte){.  sqlite
1e710 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e  3_int64 nMap = n
1e720 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
1e730 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
1e740 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
1e750 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  hOut==0 );.  OST
1e760 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1e770 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1e780 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c  p, size=%lld\n",
1e790 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1e7a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e7b0 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29  d(), pFd, nByte)
1e7c0 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e  );..  if( pFd->n
1e7d0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
1e7e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1e7f0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
1e800 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
1e810 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
1e820 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b  le*)pFd, &nMap);
1e830 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1e840 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1e850 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1e860 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1e870 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1e880 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e890 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1e8a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1e8b0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1e8c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1e8d0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  TAT;.    }.  }. 
1e8e0 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
1e8f0 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
1e900 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
1e910 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20  apSizeMax;.  }. 
1e920 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74   nMap &= ~(sqlit
1e930 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73  e3_int64)(winSys
1e940 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20  Info.dwPageSize 
1e950 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d  - 1);. .  if( nM
1e960 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d  ap==0 && pFd->mm
1e970 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1e980 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1e990 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61  );.  }.  if( nMa
1e9a0 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  p!=pFd->mmapSize
1e9b0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
1e9c0 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52  ew = 0;.    DWOR
1e9d0 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45  D protect = PAGE
1e9e0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44  _READONLY;.    D
1e9f0 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c  WORD flags = FIL
1ea00 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20  E_MAP_READ;..   
1ea10 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1ea20 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64  d);.    if( (pFd
1ea30 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
1ea40 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  NFILE_RDONLY)==0
1ea50 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63   ){.      protec
1ea60 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49  t = PAGE_READWRI
1ea70 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  TE;.      flags 
1ea80 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  |= FILE_MAP_WRIT
1ea90 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  E;.    }.#if SQL
1eaa0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1eab0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1eac0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1ead0 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20  FromApp(pFd->h, 
1eae0 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e  NULL, protect, n
1eaf0 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69  Map, NULL);.#eli
1eb00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1eb10 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1eb20 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
1eb30 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1eb40 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55  pingW(pFd->h, NU
1eb50 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1eb80 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20  ORD)((nMap>>32) 
1eb90 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ebc0 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78  DWORD)(nMap & 0x
1ebd0 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29  ffffffff), NULL)
1ebe0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1ebf0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1ec00 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e  _ANSI).    pFd->
1ec10 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1ec20 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d  ileMappingA(pFd-
1ec30 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1ec40 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1ec70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1ec80 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1ecb0 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1ecc0 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
1ecd0 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70     if( pFd->hMap
1ece0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
1ecf0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
1ed00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1ed10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1ed20 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1ed30 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
1ed40 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31      "winMapfile1
1ed70 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
1ed80 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
1ed90 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
1eda0 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
1edb0 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
1edc0 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
1edd0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1ede0 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d  FILE-CREATE pid=
1edf0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1ee00 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1ee10 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1ee20 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ee30 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1ee40 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1ee50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ee60 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OK;.    }.    as
1ee70 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69  sert( (nMap % wi
1ee80 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
1ee90 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ize)==0 );.    a
1eea0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49  ssert( sizeof(SI
1eeb0 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71  ZE_T)==sizeof(sq
1eec0 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20  lite3_int64) || 
1eed0 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66  nMap<=0xffffffff
1eee0 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
1eef0 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77  S_WINRT.    pNew
1ef00 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1ef10 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  leFromApp(pFd->h
1ef20 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28  Map, flags, 0, (
1ef30 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
1ef40 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  lse.    pNew = o
1ef50 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
1ef60 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
1ef70 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e   0, 0, (SIZE_T)n
1ef80 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Map);.#endif.   
1ef90 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
1efa0 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  ){.      osClose
1efb0 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70  Handle(pFd->hMap
1efc0 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d  );.      pFd->hM
1efd0 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ap = NULL;.     
1efe0 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
1eff0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1f000 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1f010 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1f020 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1f030 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
1f060 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  2", pFd->zPath);
1f070 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
1f080 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
1f090 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
1f0a0 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
1f0b0 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
1f0c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1f0d0 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c  -FILE-MAP pid=%l
1f0e0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1f0f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1f100 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f110 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f120 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
1f130 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1f140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d  ;.    }.    pFd-
1f160 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e  >pMapRegion = pN
1f170 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ew;.    pFd->mma
1f180 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20  pSize = nMap;.  
1f190 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41    pFd->mmapSizeA
1f1a0 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20  ctual = nMap;.  
1f1b0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d  }..  OSTRACE(("M
1f1c0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1f1d0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1f1e0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
1f1f0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f200 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f210 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  pFd));.  return 
1f220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1f230 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
1f240 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
1f250 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69  ../*.** If possi
1f260 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ble, return a po
1f270 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
1f280 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74  ng of file fd st
1f290 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74  arting at offset
1f2a0 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61  .** iOff. The ma
1f2b0 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61  pping must be va
1f2c0 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  lid for at least
1f2d0 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a   nAmt bytes..**.
1f2e0 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69  ** If such a poi
1f2f0 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61  nter can be obta
1f300 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69  ined, store it i
1f310 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e  n *pp and return
1f320 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
1f330 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  r, if one cannot
1f340 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1f350 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f  curs, set *pp to
1f360 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51   0 and return SQ
1f370 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61  LITE_OK..** Fina
1f380 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1f390 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
1f3a0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1f3b0 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
1f3c0 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
1f3d0 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64  *pp is undefined
1f3e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1f3f0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
1f400 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72  ction does retur
1f410 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  n a pointer, the
1f420 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65   caller must eve
1f430 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65  ntually .** rele
1f440 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
1f450 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e  e by calling win
1f460 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74  Unfetch()..*/.st
1f470 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63  atic int winFetc
1f480 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1f490 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
1f4a0 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
1f4b0 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
1f4c0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1f4d0 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
1f4e0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
1f4f0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1f500 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1f510 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20  */.#endif.  *pp 
1f520 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
1f530 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
1f540 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
1f550 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25  t=%lld, amount=%
1f560 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  d, pp=%p\n",.   
1f570 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f580 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f590 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c   fd, iOff, nAmt,
1f5a0 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49   pp));..#if SQLI
1f5b0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1f5c0 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  >0.  if( pFd->mm
1f5d0 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20  apSizeMax>0 ){. 
1f5e0 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70     if( pFd->pMap
1f5f0 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Region==0 ){.   
1f600 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d     int rc = winM
1f610 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
1f620 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f640 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45      OSTRACE(("FE
1f650 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1f660 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1f670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f680 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1f690 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1f6a0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1f6b0 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
1f6c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f6d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f6e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
1f6f0 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
1f700 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
1f710 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
1f720 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
1f730 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
1f740 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1f750 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  f..  OSTRACE(("F
1f760 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1f770 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a  ile=%p, pp=%p, *
1f780 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  pp=%p, rc=SQLITE
1f790 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1f7a0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f7b0 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
1f7c0 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74  pp, *pp));.  ret
1f7d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f7e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
1f7f0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
1f800 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
1f810 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1f820 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66  leases a .** ref
1f830 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
1f840 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
1f850 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29  ll to winFetch()
1f860 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  . The second.** 
1f870 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1f880 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1f890 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
1f8a0 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  e as the corresp
1f8b0 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65  onding.** argume
1f8c0 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73  nt that was pass
1f8d0 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74  ed to the winFet
1f8e0 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
1f8f0 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
1f900 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
1f910 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1f920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f930 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
1f940 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
1f950 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
1f960 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
1f970 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
1f980 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
1f990 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
1f9a0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
1f9b0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
1f9c0 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
1f9d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
1f9e0 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
1f9f0 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
1fa00 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1fa10 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
1fa20 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1fa30 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1fa40 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
1fa50 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70  le */..  /* If p
1fa60 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
1fa70 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
1fa80 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
1fa90 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
1faa0 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
1fab0 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
1fac0 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
1fad0 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
1fae0 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
1faf0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1fb00 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
1fb10 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
1fb20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
1fb30 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
1fb40 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
1fb50 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
1fb60 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
1fb70 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
1fb80 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
1fb90 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
1fba0 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
1fbb0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
1fbc0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1fbd0 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
1fbe0 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  d, p=%p\n",.    
1fbf0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1fc00 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1fc10 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a  pFd, iOff, p));.
1fc20 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fc30 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
1fc40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1fc50 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e  * FIXME:  If Win
1fc60 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79  dows truly alway
1fc70 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63  s prevents trunc
1fc80 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e  ating or deletin
1fc90 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  g a.    ** file 
1fca0 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20  while a mapping 
1fcb0 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68  is held, then th
1fcc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55  e following winU
1fcd0 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a  nmapfile() call.
1fce0 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65      ** is unnece
1fcf0 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65  ssary can can be
1fd00 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e   omitted - poten
1fd10 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67  tially improving
1fd20 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61  .    ** performa
1fd30 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e  nce.  */.    win
1fd40 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1fd50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1fd60 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30  Fd->nFetchOut>=0
1fd70 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
1fd80 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
1fd90 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1fda0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1fdb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1fdc0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1fdd0 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20  ssId(), fd));.  
1fde0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fdf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
1fe00 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
1fe10 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
1fe20 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1fe30 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
1fe40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1fe50 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
1fe60 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
1fe70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1fe90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1feb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fed0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
1fee0 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
1fef0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
1ff00 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
1ff10 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
1ff20 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
1ff30 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
1ff40 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1ff50 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
1ff60 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1ff90 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
1ffa0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1ffc0 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
1ffd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1ffe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
1fff0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
20000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20010 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
20020 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
20030 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20040 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
20050 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
20060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20070 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
20080 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
20090 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
200a0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
200b0 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
200c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
200d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
200e0 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
200f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20100 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
20110 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
20120 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
20130 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
20140 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
20150 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
20160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20170 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
20180 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
20190 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
201a0 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
201b0 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
201c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
201d0 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
201e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
201f0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
20200 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
20210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20220 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
20230 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20250 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
20260 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
20270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20280 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
20290 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
202b0 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
202c0 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
202f0 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
20320 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
20330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20370 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
20390 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
203a0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
203b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
203c0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
203d0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
203e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
203f0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
20400 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
20410 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
20420 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
20430 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
20440 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
20450 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
20460 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
20470 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
20480 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
20490 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
204a0 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
204b0 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
204c0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
204d0 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
204e0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
204f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
20500 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
20510 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
20520 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
20530 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
20540 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
20550 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
20560 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
20570 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
20580 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
20590 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
205a0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
205b0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
205c0 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
205d0 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
205e0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
205f0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
20600 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
20610 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
20620 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
20630 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
20640 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
20650 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
20660 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
20670 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
20680 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
20690 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
206a0 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
206b0 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
206c0 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
206d0 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
206e0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
206f0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
20700 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
20710 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
20720 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
20730 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
20740 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
20750 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
20760 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
20770 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
20780 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
20790 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
207a0 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
207b0 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
207c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
207d0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
207e0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
207f0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
20800 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
20810 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
20820 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
20830 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
20840 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
20850 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
20860 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20870 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
20880 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
20890 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
208a0 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
208b0 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
208c0 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
208d0 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
208e0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
208f0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
20900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20910 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
20920 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
20930 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
20940 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
20950 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
20960 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
20970 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
20980 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
20990 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
209a0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
209b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
209c0 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
209d0 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
209e0 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
209f0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
20a00 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
20a10 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
20a20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
20a30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
20a40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
20a50 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
20a60 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
20a70 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
20a80 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
20a90 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
20aa0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
20ab0 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
20ac0 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
20ad0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
20ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
20af0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
20b00 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
20b10 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
20b20 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
20b30 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
20b40 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
20b50 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
20b60 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
20b70 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
20b80 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
20b90 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
20ba0 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
20bb0 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
20bc0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
20bd0 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
20be0 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
20bf0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
20c00 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
20c10 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
20c20 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
20c30 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
20c40 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
20c50 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
20c60 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
20c70 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
20c80 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
20c90 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
20ca0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
20cb0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
20cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
20cd0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
20ce0 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
20cf0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
20d00 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
20d10 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f  ile.  ** name fo
20d20 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
20d30 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66  file.  If this f
20d40 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20  ails, we cannot 
20d50 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20  continue..  */. 
20d60 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78   nMax = pVfs->mx
20d70 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d  Pathname; nBuf =
20d80 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75   nMax + 2;.  zBu
20d90 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f = sqlite3Mallo
20da0 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20  cZero( nBuf );. 
20db0 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20   if( !zBuf ){.  
20dc0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
20dd0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
20de0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
20df0 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
20e00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
20e10 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
20e20 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66  igure out the ef
20e30 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72  fective temporar
20e40 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69  y directory.  Fi
20e50 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e  rst, check if on
20e60 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20  e.  ** has been 
20e70 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62  explicitly set b
20e80 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
20e90 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  n; otherwise, us
20ea0 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63  e the one.  ** c
20eb0 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65  onfigured by the
20ec0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
20ed0 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d  m..  */.  nDir =
20ee0 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20   nMax - (nPre + 
20ef0 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  15);.  assert( n
20f00 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73  Dir>0 );.  if( s
20f10 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
20f20 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74  ctory ){.    int
20f30 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74   nDirLen = sqlit
20f40 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
20f50 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
20f60 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72  y);.    if( nDir
20f70 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Len>0 ){.      i
20f80 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70 28  f( !winIsDirSep(
20f90 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
20fa0 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31  ectory[nDirLen-1
20fb0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44  ]) ){.        nD
20fc0 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  irLen++;.      }
20fd0 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c  .      if( nDirL
20fe0 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20  en>nDir ){.     
20ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21000 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f  zBuf);.        O
21010 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21020 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21030 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
21040 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
21050 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
21060 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74  RROR, 0, "winGet
21070 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a  Tempname1", 0);.
21080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21090 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
210a0 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
210b0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
210c0 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a  rectory);.    }.
210d0 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
210e0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
210f0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
21100 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
21110 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30  s[] = {.       0
21120 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c  , /* getenv("SQL
21130 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a  ITE_TMPDIR") */.
21140 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21150 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f  env("TMPDIR") */
21160 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21170 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20  tenv("TMP") */. 
21180 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21190 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20  nv("TEMP") */.  
211a0 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
211b0 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29  v("USERPROFILE")
211c0 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72   */.       "/var
211d0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
211e0 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20  usr/tmp",.      
211f0 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20   "/tmp",.       
21200 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20  ".",.       0   
21210 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
21220 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d  minator */.    }
21230 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
21240 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
21250 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
21260 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
21270 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20  [0] ) azDirs[0] 
21280 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
21290 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  _TMPDIR");.    i
212a0 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
212b0 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
212c0 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
212d0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d    if( !azDirs[2]
212e0 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67   ) azDirs[2] = g
212f0 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20  etenv("TMP");.  
21300 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d    if( !azDirs[3]
21310 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67   ) azDirs[3] = g
21320 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20  etenv("TEMP");. 
21330 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34     if( !azDirs[4
21340 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20  ] ) azDirs[4] = 
21350 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46  getenv("USERPROF
21360 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  ILE");.    for(i
21370 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
21380 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
21390 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
213a0 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20  irs[i++]){.     
213b0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
213c0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69  d;.      if( zDi
213d0 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
213e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
213f0 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69 74   path starts wit
21400 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72  h a drive letter
21410 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65   followed by the
21420 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20   colon.      ** 
21430 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d  character, assum
21440 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  e it is already 
21450 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70  a native Win32 p
21460 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a  ath; otherwise,.
21470 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74        ** it must
21480 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   be converted to
21490 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
214a0 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79 67  path via the Cyg
214b0 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a  win API.      **
214c0 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20   prior to using 
214d0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
214e0 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76     if( winIsDriv
214f0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
21500 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20  zDir) ){.       
21510 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
21520 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
21530 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a  Filename(zDir);.
21540 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
21550 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
21560 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21570 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
21580 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21590 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
215a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
215b0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
215c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
215d0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
215e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
215f0 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
21600 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
21610 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21620 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
21630 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20   "%s", zDir);.  
21640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21650 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21660 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
21670 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21680 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21690 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
216a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
216b0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
216c0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
216d0 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20  ro( nMax+1 );.  
216e0 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76        if( !zConv
216f0 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20  erted ){.       
21700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21710 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21720 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21730 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21740 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
21750 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
21760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21770 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
21780 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21790 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
217a0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
217b0 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50    osIsNT() ? CCP
217c0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
217d0 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
217e0 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20  IN_A, zDir,.    
217f0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e              zCon
21800 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c  verted, nMax+1)<
21810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
21820 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21830 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21840 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21850 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21860 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21870 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21880 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
21890 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  H\n"));.        
218a0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
218b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
218c0 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  R_CONVPATH, (DWO
218d0 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
21900 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b  mpname2", zDir);
21910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21920 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28     if( winIsDir(
21930 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
21940 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74           /* At t
21950 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
21960 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ow the candidate
21970 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73 74   directory exist
21980 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20  s and should.   
21990 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65         ** be use
219a0 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20  d.  However, we 
219b0 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76  may need to conv
219c0 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 63  ert the string c
219d0 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20  ontaining.      
219e0 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20      ** its name 
219f0 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e  into UTF-8 (i.e.
21a00 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31 36   if it is UTF-16
21a10 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20   right now)..   
21a20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21a30 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
21a40 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
21a50 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76  f8Filename(zConv
21a60 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
21a70 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a    if( !zUtf8 ){.
21a80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21a90 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
21aa0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
21ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21ac0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
21ad0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
21ae0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
21af0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
21b00 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
21b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21b20 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
21b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21b40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21b50 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
21b60 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
21b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21b80 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
21b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21ba0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
21bb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
21bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21bd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21be0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
21bf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21c00 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
21c10 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
21c20 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
21c30 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54   else if( osIsNT
21c40 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
21c50 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53  zMulti;.    LPWS
21c60 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73  TR zWidePath = s
21c70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
21c80 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43  ( nMax*sizeof(WC
21c90 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20  HAR) );.    if( 
21ca0 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20  !zWidePath ){.  
21cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21cc0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
21cd0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21ce0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21cf0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
21d00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21d10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21d20 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
21d30 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
21d40 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29  nMax, zWidePath)
21d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
21d60 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
21d70 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
21d80 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21d90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21da0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
21db0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
21dc0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
21dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
21de0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
21df0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
21e00 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
21e10 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
21e30 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c  inGetTempname2",
21e40 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
21e50 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
21e60 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
21e70 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
21e80 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
21e90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
21ea0 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
21eb0 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
21ec0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c  qlite3_free(zMul
21ed0 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
21ee0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
21ef0 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  h);.    }else{. 
21f00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21f10 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
21f20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21f30 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
21f40 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21f50 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21f60 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
21f70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21f90 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  M;.    }.  }.#if
21fa0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
21fb0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
21fc0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66  {.    char *zUtf
21fd0 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62  8;.    char *zMb
21fe0 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  csPath = sqlite3
21ff0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78  MallocZero( nMax
22000 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62   );.    if( !zMb
22010 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  csPath ){.      
22020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22030 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
22040 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22050 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22060 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
22070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22080 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47     }.    if( osG
220a0 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78  etTempPathA(nMax
220b0 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20  , zMbcsPath)==0 
220c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
220d0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
220e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
220f0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22100 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
22110 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
22120 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
22130 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
22140 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
22150 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
22160 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22170 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
22180 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29  etTempname3", 0)
22190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
221a0 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  8 = sqlite3_win3
221b0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
221c0 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
221d0 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
221e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
221f0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
22200 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
22210 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22220 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
22230 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
22240 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22250 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22260 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22270 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22280 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
22290 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
222a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
222b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
222c0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
222d0 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21  I */.#endif /* !
222e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
222f0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68  */..  /*.  ** Ch
22300 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
22310 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
22320 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69  irectory ends wi
22330 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  th an appropriat
22340 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72  e.  ** separator
22350 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
22360 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  t and there is n
22370 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ot enough space 
22380 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a  left to add.  **
22390 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f   one, fail..  */
223a0 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45  .  if( !winMakeE
223b0 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b  ndInDirSep(nDir+
223c0 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20  1, zBuf) ){.    
223d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
223e0 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  f);.    OSTRACE(
223f0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22400 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
22410 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
22420 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22430 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
22440 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c  inGetTempname4",
22450 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   0);.  }..  /*. 
22460 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   ** Check that t
22470 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
22480 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
22490 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
224a0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
224b0 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  me in the follow
224c0 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a  ing format:.  **
224d0 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72  .  **   "<tempor
224e0 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65  ary_directory>/e
224f0 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58  tilqs_XXXXXXXXXX
22500 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a  XXXXX\0\0".  **.
22510 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74    ** If not, ret
22520 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
22530 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37  .  The number 17
22540 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69 6e   is used here in
22550 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61   order to.  ** a
22560 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73  ccount for the s
22570 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
22580 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72 61   15 character ra
22590 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20  ndom suffix and 
225a0 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61  the.  ** two tra
225b0 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63  iling NUL charac
225c0 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c  ters.  The final
225d0 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72   directory separ
225e0 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20  ator character. 
225f0 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
22600 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73 20  added if it was 
22610 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65 73  not already pres
22620 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e  ent..  */.  nLen
22630 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
22640 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  30(zBuf);.  if( 
22650 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31  (nLen + nPre + 1
22660 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20  7) > nBuf ){.   
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 4f 53 54 52 41 43 45  uf);.    OSTRACE
22690 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
226a0 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
226b0 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
226c0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
226d0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
226e0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22  winGetTempname5"
226f0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  , 0);.  }..  sql
22700 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
22710 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66  uf-16-nLen, zBuf
22720 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45  +nLen, SQLITE_TE
22730 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
22740 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53  ..  j = sqlite3S
22750 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
22760 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
22770 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
22780 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
22790 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
227a0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
227b0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
227c0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
227d0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
227e0 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20  rs)-1) ];.  }.  
227f0 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a  zBuf[j] = 0;.  z
22800 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
22810 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a  *pzBuf = zBuf;..
22820 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22830 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25  -FILENAME name=%
22840 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  s, rc=SQLITE_OK\
22850 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
22860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22880 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
22890 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79  d file is really
228a0 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52   a directory.  R
228b0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a  eturn false if.*
228c0 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e  * it is somethin
228d0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64  g other than a d
228e0 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20  irectory, or if 
228f0 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
22900 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  d of memory.** a
22910 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
22920 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22930 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20   winIsDir(const 
22940 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
22950 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
22960 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
22970 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
22980 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
22990 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
229a0 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
229b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
229c0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
229d0 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
229e0 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
229f0 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
22a00 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
22a10 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
22a20 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
22a30 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a50 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
22a60 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a80 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
22a90 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
22aa0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
22ab0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
22ac0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
22ad0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
22ae0 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20  * Invalid name? 
22af0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74  */.    }.    att
22b00 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
22b10 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
22b20 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
22b30 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
22b40 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
22b50 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
22b60 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
22b70 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
22b80 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49   return (attr!=I
22b90 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
22ba0 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72  IBUTES) && (attr
22bb0 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
22bc0 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f  DIRECTORY);.}../
22bd0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
22be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22bf0 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
22c00 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
22c10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
22c20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68  get maximum path
22c30 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a   name length */.
22c40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
22c50 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame,        /* N
22c60 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
22c70 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
22c80 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
22c90 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22ca0 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
22cb0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
22cc0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
22cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
22ce0 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  en mode flags */
22cf0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
22d00 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
22d10 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c  Status return fl
22d20 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44  ags */.){.  HAND
22d30 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61  LE h;.  DWORD la
22d40 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44  stErrno = 0;.  D
22d50 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
22d60 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
22d70 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
22d80 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
22d90 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
22da0 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
22db0 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
22dc0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
22dd0 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
22de0 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
22df0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
22e00 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
22e10 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
22e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22e30 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
22e40 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
22e50 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
22e60 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
22e70 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
22e80 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
22e90 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
22ea0 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
22eb0 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
22ec0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
22ed0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
22ee0 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
22ef0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
22f00 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
22f10 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
22f20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
22f30 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d  char *zTmpname =
22f40 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f   0; /* For tempo
22f50 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69  rary filename, i
22f60 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a  f necessary. */.
22f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22f80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
22f90 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
22fa0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
22fb0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
22fc0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
22fd0 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
22fe0 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
22ff0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
23000 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
23010 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
23020 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
23030 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23040 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
23050 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
23060 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23070 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23080 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
23090 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
230a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
230b0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
230c0 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
230d0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
230e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
230f0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
23100 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
23110 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23120 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
23130 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
23140 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
23150 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
23160 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
23170 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
23180 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
23190 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
231a0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
231b0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
231c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
231d0 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f   ));.#endif..  O
231e0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
231f0 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c  me=%s, pFile=%p,
23200 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46   flags=%x, pOutF
23210 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  lags=%p\n",.    
23220 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65         zUtf8Name
23230 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75  , id, flags, pOu
23240 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20  tFlags));..  /* 
23250 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
23260 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
23270 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
23280 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
23290 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
232a0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
232b0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
232c0 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
232d0 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
232e0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
232f0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
23300 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
23310 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
23320 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
23330 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
23340 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
23350 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
23360 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
23370 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
23380 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
23390 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
233a0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
233b0 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
233c0 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
233d0 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
233e0 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
233f0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
23400 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
23410 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
23420 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
23430 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
23440 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
23450 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
23460 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
23470 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
23480 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
23490 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
234a0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
234b0 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
234c0 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
234d0 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
234e0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
234f0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
23500 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
23510 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
23520 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
23530 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
23540 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
23550 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
23560 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
23570 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
23580 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
23590 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
235a0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
235b0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
235c0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
235d0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
235e0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
235f0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
23600 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
23610 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
23620 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
23630 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
23640 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23650 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
23660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
23670 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
23680 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23690 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
236a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
236b0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
236c0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
236d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
236e0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
236f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23700 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
23710 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
23720 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23730 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
23740 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23750 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61  EN_WAL.  );..  a
23760 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
23770 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
23780 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  e, 0, sizeof(win
23790 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
237a0 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
237b0 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20  DLE_VALUE;..#if 
237c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
237d0 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
237e0 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d   && !sqlite3_tem
237f0 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
23800 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
23810 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20  QLITE_ERROR,.   
23820 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65       "sqlite3_te
23830 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72  mp_directory var
23840 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  iable should be 
23850 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b  set for WinRT");
23860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
23870 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
23880 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
23890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
238a0 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
238b0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
238c0 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
238d0 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
238e0 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  8Name ){.    ass
238f0 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26 26  ert( isDelete &&
23900 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20   !isOpenJournal 
23910 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 47  );.    rc = winG
23920 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c  etTempname(pVfs,
23930 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20   &zTmpname);.   
23940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  OK ){.      OSTR
23960 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
23970 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66  %s, rc=%s", zUtf
23980 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  8Name, sqlite3Er
23990 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
239a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
239b0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
239c0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
239d0 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
239e0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
239f0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
23a00 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
23a10 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
23a20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
23a30 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
23a40 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
23a50 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
23a60 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
23a70 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
23a80 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
23a90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23aa0 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
23ab0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
23ac0 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61  |.       zUtf8Na
23ad0 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
23ae0 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  30(zUtf8Name)+1]
23af0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
23b00 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
23b10 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
23b20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
23b30 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
23b40 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
23b50 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65  lename(zUtf8Name
23b60 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
23b70 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
23b80 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
23b90 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
23ba0 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
23bb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
23bc0 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e  R_NOMEM", zUtf8N
23bd0 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
23be0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
23bf0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
23c00 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
23c10 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  rted) ){.    sql
23c20 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
23c30 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
23c40 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
23c50 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
23c60 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
23c70 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
23c80 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e  N_ISDIR", zUtf8N
23c90 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
23ca0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
23cb0 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20  N_ISDIR;.  }..  
23cc0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
23cd0 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  ){.    dwDesired
23ce0 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
23cf0 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f  _READ | GENERIC_
23d00 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
23d10 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
23d20 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
23d30 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51  AD;.  }..  /* SQ
23d40 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
23d50 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d  IVE is used to m
23d60 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20  ake sure that a 
23d70 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  new file is .  *
23d80 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
23d90 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
23da0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
23db0 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20  clusive access" 
23dc0 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
23dd0 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
23de0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
23df0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
23e00 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
23e10 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
23e20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
23e30 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
23e40 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
23e50 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
23e60 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
23e70 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
23e80 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
23e90 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
23ea0 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
23eb0 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
23ec0 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
23ed0 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
23ee0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
23ef0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
23f00 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
23f10 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
23f20 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
23f30 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
23f40 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
23f50 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
23f60 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
23f70 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
23f80 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
23f90 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
23fa0 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
23fb0 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
23fc0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
23fd0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
23fe0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
23ff0 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
24000 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
24010 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
24020 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
24030 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
24040 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
24070 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
240a0 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
240b0 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
240c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
240d0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
240e0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
240f0 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
24100 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
24110 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
24120 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
24130 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
24140 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
24150 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
24160 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
24170 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
24180 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24190 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
241a0 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
241b0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
241c0 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
241d0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
241e0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
241f0 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49  NRT.    CREATEFI
24200 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
24210 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64  AMETERS extended
24220 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20  Parameters;.    
24230 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
24240 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65  rs.dwSize = size
24250 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45  of(CREATEFILE2_E
24260 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
24270 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  RS);.    extende
24280 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
24290 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20  leAttributes =. 
242a0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
242b0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
242c0 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
242d0 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
242e0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
242f0 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c  FileFlags = dwFl
24300 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
24310 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53   & FILE_FLAG_MAS
24320 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
24330 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75  arameters.dwSecu
24340 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53  rityQosFlags = S
24350 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55  ECURITY_ANONYMOU
24360 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  S;.    extendedP
24370 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75  arameters.lpSecu
24380 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d  rityAttributes =
24390 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e   NULL;.    exten
243a0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54  dedParameters.hT
243b0 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55  emplateFile = NU
243c0 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  LL;.    while( (
243d0 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
243e0 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
243f0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24410 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
24420 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
24450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24470 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
24480 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244a0 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72      &extendedPar
244b0 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c  ameters))==INVAL
244c0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
244d0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244f0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
24500 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
24510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24520 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
24530 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
24540 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
24550 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
24560 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
24590 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
245c0 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
245f0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
24600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24630 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
24660 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24670 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
246a0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
246b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
246c0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
246d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
246e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
246f0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
24700 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
24710 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
24720 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
24730 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
24760 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
24790 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
247c0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
247f0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
24820 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
24830 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
24860 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
24870 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24890 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
248a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c   }.#endif.  winL
248b0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20  ogIoerr(cnt);.. 
248c0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
248d0 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
248e0 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
248f0 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
24900 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
24910 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24920 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
24930 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
24940 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
24950 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
24960 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
24970 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
24980 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
24990 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
249a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
249b0 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
249c0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
249d0 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
249e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
249f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24a00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
24a10 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
24a20 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
24a30 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
24a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
24a50 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
24a60 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  , id, .         
24a70 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
24a80 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a  PEN_READONLY) &.
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50       ~(SQLITE_OP
24ab0 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
24ac0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
24ad0 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74  ),.         pOut
24ae0 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
24af0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
24b00 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
24b10 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
24b20 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
24b30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
24b40 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
24b50 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
24b60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
24b70 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
24b80 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
24b90 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
24ba0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
24bb0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
24bc0 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61  OPEN file=%p, na
24bd0 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c  me=%s, access=%l
24be0 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c  x, pOutFlags=%p,
24bf0 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20   *pOutFlags=%d, 
24c00 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63  ".           "rc
24c10 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
24c20 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
24c30 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73  ccess, pOutFlags
24c40 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20  , pOutFlags ?.  
24c50 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c           *pOutFl
24c60 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56  ags : 0, (h==INV
24c70 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
24c80 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
24c90 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c  "ok"));..#if SQL
24ca0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
24cb0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
24cc0 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
24cd0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
24ce0 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
24cf0 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
24d00 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
24d10 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
24d20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29  osCloseHandle(h)
24d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
24d40 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
24d50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24d60 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
24d70 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43  OSTRACE(("OPEN-C
24d80 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20  E-LOCK name=%s, 
24d90 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c  rc=%s\n", zName,
24da0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
24db0 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rc)));.    retur
24dc0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
24dd0 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
24de0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
24df0 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
24e00 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
24e10 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
24e20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24e30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
24e40 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
24e50 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
24e60 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
24e70 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  d;.  pFile->pVfs
24e80 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
24e90 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69  ->h = h;.  if( i
24ea0 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
24eb0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
24ec0 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f  s |= WINFILE_RDO
24ed0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
24ee0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
24ef0 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22  an(zName, "psow"
24f00 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
24f10 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
24f20 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
24f30 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
24f40 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69  _PSOW;.  }.  pFi
24f50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
24f60 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c  NO_ERROR;.  pFil
24f70 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
24f80 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
24f90 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
24fa0 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
24fb0 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  L;.  pFile->pMap
24fc0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46  Region = 0;.  pF
24fd0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
24fe0 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
24ff0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
25000 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
25010 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
25020 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
25030 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65  p;.#endif..  Ope
25040 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
25050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25060 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
25070 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
25080 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
25090 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
250a0 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
250b0 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
250c0 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
250d0 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
250e0 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
250f0 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
25100 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
25110 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
25120 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
25130 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
25140 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
25150 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
25160 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
25170 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
25180 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
25190 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
251a0 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
251b0 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
251c0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
251d0 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
251e0 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
251f0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
25200 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
25210 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
25220 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
25230 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
25240 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
25250 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
25260 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
25270 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
25280 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
25290 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
252a0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
252b0 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
252c0 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
252d0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
252e0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
252f0 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
25300 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
25330 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
25340 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
25350 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
25360 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
25370 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
25380 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
25390 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
253a0 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
253b0 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
253c0 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
253d0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
253e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
253f0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
25400 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
25410 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a  syncDir=%d\n", z
25420 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69  Filename, syncDi
25430 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  r));..  zConvert
25440 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
25450 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
25460 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
25470 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
25480 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
25490 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
254a0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
254b0 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
254c0 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
254d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
254e0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
254f0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
25500 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
25510 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
25520 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
25530 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
25540 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
25550 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
25560 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
25570 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
25580 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
25590 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
255a0 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
255b0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255d0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
255e0 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
255f0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
25600 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
25610 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
25620 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
25630 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
25640 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
25650 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
25660 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
25670 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
25680 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
25690 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
256a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
256b0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
256c0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
256d0 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
256e0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
256f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25700 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25720 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
25730 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
25740 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
25750 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
25760 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
25770 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
25780 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
25790 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
257a0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
257b0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
257c0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
257d0 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
257e0 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
257f0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
25800 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
25810 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
25820 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25830 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
25840 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
25850 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
25860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
25870 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
258a0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
258b0 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
258c0 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
258d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
258e0 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
258f0 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
25900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25910 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
25920 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
25930 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
25940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25950 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
25960 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
25970 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25980 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
25990 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
259a0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
259b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
259c0 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
259d0 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
259e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
259f0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
25a00 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
25a10 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
25a20 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
25a30 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
25a40 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
25a50 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
25a60 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
25a70 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
25a80 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
25a90 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
25aa0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
25ab0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
25ac0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
25ad0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
25ae0 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
25af0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
25b00 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
25b10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25b20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
25b30 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
25b40 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
25b50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25b60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25b70 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25b80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
25b90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25ba0 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
25bb0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
25bc0 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
25bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
25be0 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
25bf0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
25c00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25c10 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
25c20 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
25c30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
25c40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
25c50 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
25c60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
25c70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
25c80 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
25c90 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
25ca0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
25cb0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
25cc0 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
25cd0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
25ce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25cf0 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
25d00 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
25d10 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  c && rc!=SQLITE_
25d20 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
25d30 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  NT ){.    rc = w
25d40 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
25d50 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
25d60 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44  lastErrno, "winD
25d70 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
25d80 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
25d90 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
25da0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25db0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25dc0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
25dd0 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
25de0 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
25df0 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
25e00 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
25e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25e20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
25e30 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
25e40 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
25e50 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
25e60 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
25e70 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
25e80 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
25e90 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
25ea0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25eb0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25ec0 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
25ed0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ef0 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
25f00 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
25f10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
25f20 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
25f30 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
25f40 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
25f50 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
25f60 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
25f70 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
25f80 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
25f90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25fa0 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
25fb0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
25fc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25fd0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53  _ACCESS; );.  OS
25fe0 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
25ff0 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78  ame=%s, flags=%x
26000 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
26010 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
26020 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52  ename, flags, pR
26030 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e  esOut));..  zCon
26040 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
26050 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
26060 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
26070 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
26080 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
26090 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
260a0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
260b0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
260c0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
260d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
260e0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
260f0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
26100 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
26110 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
26120 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
26130 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
26140 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
26150 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
26160 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
26170 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
26180 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
26190 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
261a0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
261d0 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20  oStandard, .    
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
26200 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
26210 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26220 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
26230 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
26240 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
26250 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
26260 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
26270 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
26280 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
26290 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
262a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
262b0 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
262c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
262d0 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
262e0 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
262f0 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20  SizeHigh==0 .   
26300 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
26310 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
26320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
26330 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
26340 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
26350 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26360 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
26370 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
26380 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
26390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
263a0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29  winLogIoerr(cnt)
263b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
263c0 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c  Errno!=ERROR_FIL
263d0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c  E_NOT_FOUND && l
263e0 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
263f0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
26400 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26410 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26420 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
26430 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
26440 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
26450 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  SS, lastErrno, "
26460 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20  winAccess",.    
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
26490 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
264a0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
264b0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
264c0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
264d0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
264e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
264f0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
26500 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
26510 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
26520 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
26530 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
26540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26550 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
26560 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
26570 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
26580 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
26590 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
265a0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
265b0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
265c0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
265d0 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
265e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
265f0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
26600 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
26610 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
26620 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
26630 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
26640 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
26650 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
26660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26670 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
26680 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
26690 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
266a0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
266b0 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
266c0 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
266d0 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %s, pResOut=%p, 
266e0 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
266f0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
26700 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
26710 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  me, pResOut, *pR
26720 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
26730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26740 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
26750 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
26760 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
26770 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
26780 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20  drive letter.** 
26790 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
267a0 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  lon character..*
267b0 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
267c0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
267d0 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20  dColon(.  const 
267e0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
267f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71  ){.  return ( sq
26800 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
26810 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
26820 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
26830 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
26840 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
26850 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
26860 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62  th name should b
26870 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e  e used verbatim.
26880 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f    If.** non-zero
26890 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f   is returned fro
268a0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  m this function,
268b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
268c0 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c  ction must simpl
268d0 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f  y.** use the pro
268e0 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20  vided path name 
268f0 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65  verbatim -OR- re
26900 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20  solve it into a 
26910 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a  full path name.*
26920 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46  * using the GetF
26930 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33  ullPathName Win3
26940 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28  2 API function (
26950 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
26960 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
26970 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
26980 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame(.  const cha
26990 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
269a0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
269b0 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
269c0 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64  s with a forward
269d0 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b   slash or a back
269e0 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74  slash, it is eit
269f0 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c  her.  ** a legal
26a00 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c   UNC name, a vol
26a10 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  ume relative pat
26a20 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  h, or an absolut
26a30 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74  e path name in t
26a40 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66  he.  ** "Unix" f
26a50 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73  ormat on Windows
26a60 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65  .  There is no e
26a70 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65  asy way to diffe
26a80 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
26a90 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
26aa0 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65  two cases; there
26ab0 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20  fore, we return 
26ac0 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e  the safer return
26ad0 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20   value of TRUE. 
26ae0 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c   ** so that call
26af0 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
26b00 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79  tion will simply
26b10 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
26b20 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69  ..  */.  if ( wi
26b30 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e  nIsDirSep(zPathn
26b40 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72  ame[0]) ){.    r
26b50 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
26b60 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
26b70 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
26b80 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72  ts with a letter
26b90 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20   and a colon it 
26ba0 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75  is either a volu
26bb0 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  me.  ** relative
26bc0 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f   path or an abso
26bd0 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c  lute path.  Call
26be0 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
26bf0 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20  tion must not.  
26c00 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72  ** attempt to tr
26c10 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61  eat it as a rela
26c20 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28  tive path name (
26c30 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64  i.e. they should
26c40 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a   simply use.  **
26c50 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20   it verbatim).. 
26c60 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
26c70 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
26c80 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29  lon(zPathname) )
26c90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
26ca0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
26cb0 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74  * If we get to t
26cc0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70  his point, the p
26cd0 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
26ce0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
26cf0 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a   be a purely.  *
26d00 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28  * relative one (
26d10 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e  i.e. not a UNC n
26d20 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74  ame, not absolut
26d30 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d  e, and not volum
26d40 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a  e relative)..  *
26d50 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  /.  return FALSE
26d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
26d70 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
26d80 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
26d90 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
26da0 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
26db0 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
26dc0 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
26dd0 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
26de0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
26df0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
26e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
26e10 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
26e20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
26e30 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
26e40 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
26e50 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
26e60 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
26e70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
26e80 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
26e90 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
26ea0 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ec0 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
26ed0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
26ee0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
26f10 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
26f20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
26f30 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
26f40 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
26f50 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
26f60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26f70 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72  (nFull);.  asser
26f80 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e  t( nFull>=pVfs->
26f90 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
26fa0 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
26fb0 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
26fc0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
26fd0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
26fe0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
26ff0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
27000 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
27010 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
27020 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
27030 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
27040 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
27050 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
27060 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
27070 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
27080 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
27090 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
270a0 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
270b0 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
270c0 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
270d0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
270e0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61  ectory and a sla
270f0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  sh..    */.    c
27100 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
27110 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
27120 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
27130 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
27140 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
27150 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27160 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
27170 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
27180 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
27190 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
271a0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
271b0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
271c0 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20  _WIN_A) |.      
271d0 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49        CCP_RELATI
271e0 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  VE, zRelative, z
271f0 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
27200 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
27210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27220 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
27230 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
27240 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
27250 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
27260 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
27290 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me1", zRelative)
272a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
272b0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
272c0 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
272d0 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
272e0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
272f0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
27300 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
27310 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27320 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27330 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
27340 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27350 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
27360 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
27370 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22   zFull, "%s%c%s"
27380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
273a0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
273b0 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
273c0 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
273d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
273e0 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
273f0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27400 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
27410 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
27420 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
27430 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27440 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
27450 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
27460 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27470 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
27480 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
27490 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
274a0 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
274b0 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
274c0 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
274d0 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20  TO_WIN_A),.     
274e0 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65         zRelative
274f0 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
27500 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
27510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27520 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
27530 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
27540 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
27550 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
27560 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
27590 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69  hname2", zRelati
275a0 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
275b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
275c0 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
275d0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
275e0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
275f0 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
27600 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27610 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
27620 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27630 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
27640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
27650 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27660 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27670 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
27680 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
27690 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
276a0 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
276b0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
276c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
276d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
276e0 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  if..#if (SQLITE_
276f0 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
27700 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20  TE_OS_WINRT) && 
27710 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
27720 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
27730 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
27740 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
27750 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f   /* WinCE has no
27760 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65   concept of a re
27770 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c  lative pathname,
27780 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64   or so I am told
27790 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20  . */.  /* WinRT 
277a0 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f  has no way to co
277b0 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65  nvert a relative
277c0 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f   path to an abso
277d0 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69  lute one. */.  i
277e0 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
277f0 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
27800 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
27810 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
27820 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
27830 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
27840 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
27850 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
27860 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
27870 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
27880 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
27890 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
278a0 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
278b0 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
278c0 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
278d0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
278e0 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
278f0 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
27900 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
27910 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
27920 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b  ctory and a back
27930 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
27940 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27950 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
27960 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
27970 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22   zFull, "%s%c%s"
27980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
279a0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
279b0 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
279c0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c  Relative);.  }el
279d0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
279e0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
279f0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
27a00 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
27a10 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
27a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
27a30 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
27a40 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
27a50 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
27a60 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
27a70 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
27a80 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a  .  DWORD nByte;.
27a90 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
27aa0 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
27ab0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
27ac0 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73  path name begins
27ad0 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65   with "/X:", whe
27ae0 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c  re "X" is any al
27af0 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68  phabetic.  ** ch
27b00 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64  aracter, discard
27b10 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22   the initial "/"
27b20 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61   from the pathna
27b30 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  me..  */.  if( z
27b40 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
27b50 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65   && winIsDriveLe
27b60 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65  tterAndColon(zRe
27b70 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20  lative+1) ){.   
27b80 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20   zRelative++;.  
27b90 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  }..  /* It's odd
27ba0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
27bb0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
27bc0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
27bd0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
27be0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
27bf0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
27c00 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
27c10 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
27c20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
27c30 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
27c40 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
27c50 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
27c60 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
27c70 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
27c80 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
27c90 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
27ca0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
27cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
27cc0 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
27cd0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
27ce0 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
27cf0 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
27d00 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
27d10 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
27d20 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
27d30 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
27d40 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
27d50 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
27d60 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
27d70 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
27d80 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
27d90 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
27da0 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
27db0 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
27dc0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
27dd0 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
27de0 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
27df0 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
27e00 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
27e10 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
27e20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
27e30 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
27e40 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
27e50 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
27e60 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
27e80 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
27e90 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
27ea0 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Sep(), zRelative
27eb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
27ec0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
27ed0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
27ee0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
27ef0 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
27f00 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
27f10 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
27f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27f30 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
27f40 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
27f50 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
27f60 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
27f70 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
27f80 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
27f90 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
27fa0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
27fb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27fc0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
27fd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27fe0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
27ff0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
28000 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28010 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28040 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
28050 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
28060 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
28070 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
28080 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
28090 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
280a0 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
280b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
280c0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
280d0 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
280e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
280f0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
28100 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
28110 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
28120 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
28130 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
28140 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
28150 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28160 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28170 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
28180 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
28190 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
281a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
281b0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
281c0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
281d0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
281e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
281f0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
28200 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28210 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
28220 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28230 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
28240 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
28250 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
28260 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
28270 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
28280 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
28290 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
282a0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
282b0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
282c0 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
282d0 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
282e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
282f0 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
28300 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28310 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
28320 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
28330 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
28340 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
28350 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
28380 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61  athname3", zRela
28390 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
283a0 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
283b0 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
283c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
283d0 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
283e0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
283f0 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
28400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28410 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
28420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28430 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
28440 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
28450 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
28460 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
28470 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
28480 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
28490 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
284a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
284b0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
284c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
284d0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
284e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
284f0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
28500 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
28510 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28530 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
28540 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me4", zRelative)
28550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
28560 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28570 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
28580 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
28590 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
285a0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
285b0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
285c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f  .#endif.  if( zO
285d0 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
285e0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
285f0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
28600 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
28610 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
28620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
28630 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ut);.    return 
28640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
28650 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
28660 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28670 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  M;.  }.#endif.}.
28680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28690 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
286a0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
286b0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
286c0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
286d0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
286e0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
286f0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
28700 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
28710 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
28720 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
28730 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
28740 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28750 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
28760 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
28770 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e  DLE h;.#if defin
28780 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
28790 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66   int nFull = pVf
287a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
287b0 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d  .  char *zFull =
287c0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
287d0 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76  ro( nFull );.  v
287e0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
287f0 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c  = 0;.  if( zFull
28800 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
28810 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
28820 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
28830 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
28840 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
28850 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
28860 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  ( winFullPathnam
28870 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
28880 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29  e, nFull, zFull)
28890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
288a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
288b0 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52  zFull);.    OSTR
288c0 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
288d0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
288e0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
288f0 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72  void*)0));.    r
28900 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
28910 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
28920 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
28930 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20  lename(zFull);. 
28940 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
28950 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f  ull);.#else.  vo
28960 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
28970 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
28980 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
28990 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
289a0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
289b0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
289c0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
289d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c      OSTRACE(("DL
289e0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
289f0 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
28a00 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29  ename, (void*)0)
28a10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
28a20 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
28a30 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
28a40 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68  E_OS_WINRT.    h
28a50 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65   = osLoadPackage
28a60 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54  dLibrary((LPCWST
28a70 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29  R)zConverted, 0)
28a80 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
28a90 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  osLoadLibraryW((
28aa0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
28ab0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
28ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
28ad0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
28ae0 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c  lse{.    h = osL
28af0 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
28b00 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
28b10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
28b20 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
28b30 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
28b40 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
28b50 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71  (void*)h));.  sq
28b60 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28b70 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
28b80 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61   (void*)h;.}.sta
28b90 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72  tic void winDlEr
28ba0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
28bb0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
28bc0 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
28bd0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28be0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e  TER(pVfs);.  win
28bf0 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
28c00 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
28c10 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29  , nBuf, zBufOut)
28c20 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
28c30 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
28c40 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69  e3_vfs *pVfs,voi
28c50 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72  d *pH,const char
28c60 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a   *zSym))(void){.
28c70 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a    FARPROC proc;.
28c80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
28c90 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63  ER(pVfs);.  proc
28ca0 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72   = osGetProcAddr
28cb0 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c  essA((HANDLE)pH,
28cc0 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43   zSym);.  OSTRAC
28cd0 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65  E(("DLSYM handle
28ce0 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20  =%p, symbol=%s, 
28cf0 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20  address=%p\n",. 
28d00 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
28d10 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64  )pH, zSym, (void
28d20 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75  *)proc));.  retu
28d30 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
28d40 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63  ))proc;.}.static
28d50 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65   void winDlClose
28d60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
28d70 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
28d80 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
28d90 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
28da0 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48  osFreeLibrary((H
28db0 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
28dc0 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c    OSTRACE(("DLCL
28dd0 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  OSE handle=%p\n"
28de0 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65  , (void*)pHandle
28df0 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  ));.}.#else /* i
28e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
28e10 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
28e20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
28e30 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20  efine winDlOpen 
28e40 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
28e50 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
28e60 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30  ine winDlSym   0
28e70 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
28e80 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
28e90 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20  ./*.** Write up 
28ea0 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  to nBuf bytes of
28eb0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f   randomness into
28ec0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
28ed0 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65   int winRandomne
28ee0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
28ef0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
28f00 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69  char *zBuf){.  i
28f10 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53  nt n = 0;.  UNUS
28f20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
28f30 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s);.#if defined(
28f40 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e  SQLITE_TEST).  n
28f50 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65   = nBuf;.  memse
28f60 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
28f70 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  ;.#else.  if( si
28f80 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29  zeof(SYSTEMTIME)
28f90 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
28fa0 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20  SYSTEMTIME x;.  
28fb0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
28fc0 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
28fd0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
28fe0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
28ff0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
29000 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
29010 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
29020 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
29030 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50   = osGetCurrentP
29040 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20  rocessId();.    
29050 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
29060 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
29070 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  d));.    n += si
29080 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23  zeof(pid);.  }.#
29090 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
290a0 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  RT.  if( sizeof(
290b0 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66  ULONGLONG)<=nBuf
290c0 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c  -n ){.    ULONGL
290d0 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ONG cnt = osGetT
290e0 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20  ickCount64();.  
290f0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
29100 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
29110 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
29120 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
29130 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
29140 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
29150 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
29160 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
29170 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
29180 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
29190 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
291a0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
291b0 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (cnt);.  }.#endi
291c0 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  f.  if( sizeof(L
291d0 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e  ARGE_INTEGER)<=n
291e0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52  Buf-n ){.    LAR
291f0 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20  GE_INTEGER i;.  
29200 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d    osQueryPerform
29210 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
29220 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29230 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66  f[n], &i, sizeof
29240 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (i));.    n += s
29250 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65  izeof(i);.  }.#e
29260 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ndif.  return n;
29270 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
29280 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
29290 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
292a0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
292b0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
292c0 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
292d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
292e0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
292f0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
29300 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
29310 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
29320 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29330 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
29340 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
29350 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
29360 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
29370 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
29380 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
29390 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
293a0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
293b0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
293c0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
293d0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
293e0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
293f0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
29400 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
29410 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
29420 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
29430 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
29440 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
29450 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
29460 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
29470 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
29480 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
29490 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
294a0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
294b0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
294c0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
294d0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
294e0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
294f0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
29500 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
29510 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
29520 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
29530 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
29540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
29550 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
29560 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
29570 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
29580 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
29590 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
295a0 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
295b0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
295c0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
295d0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
295e0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
295f0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
29600 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
29610 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
29620 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
29630 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
29640 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
29650 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
29660 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
29670 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
29680 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
29690 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
296a0 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
296b0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
296c0 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31  umber of .     1
296d0 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
296e0 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
296f0 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
29700 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20   JD 2305813.5). 
29710 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
29720 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
29730 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
29740 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
29750 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
29760 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
29770 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
29780 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
29790 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
297a0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
297b0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
297c0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
297d0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
297e0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
297f0 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
29800 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
29810 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
29820 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
29830 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20  32BitValue = .  
29840 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
29850 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
29860 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
29870 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20  000000000 +.    
29880 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
29890 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
298a0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
298b0 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
298c0 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65  me;.  osGetSyste
298d0 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
298e0 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
298f0 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
29900 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
29910 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f  ero. */.  if (!o
29920 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
29930 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
29940 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29950 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
29960 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
29970 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
29980 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
29990 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
299a0 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
299b0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
299c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
299d0 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
299e0 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
299f0 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
29a00 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
29a10 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  )ft.dwLowDateTim
29a20 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  e)/(sqlite3_int6
29a30 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66  4)10000;..#ifdef
29a40 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
29a50 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
29a60 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
29a70 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
29a80 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
29a90 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
29aa0 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
29ab0 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
29ac0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
29ad0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29ae0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29af0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
29b00 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
29b10 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
29b20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
29b30 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
29b40 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
29b50 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
29b60 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
29b70 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
29b80 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
29b90 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
29ba0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
29bb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
29bc0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
29bd0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
29be0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
29bf0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
29c00 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
29c10 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
29c20 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
29c30 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
29c40 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
29c50 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
29c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29c70 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
29c80 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
29c90 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
29ca0 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
29cb0 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
29cc0 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
29cd0 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ge() on Windows 
29ce0 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
29cf0 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
29d00 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   Unix). After an
29d10 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
29d20 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
29d30 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
29d40 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
29d50 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
29d60 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
29d70 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
29d80 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
29d90 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
29da0 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
29db0 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
29dc0 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
29dd0 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
29de0 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
29df0 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
29e00 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
29e10 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
29e20 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
29e30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
29e40 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
29e50 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
29e60 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
29e70 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
29e80 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
29e90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
29ea0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
29eb0 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
29ec0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
29ed0 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
29ee0 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
29ef0 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
29f00 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
29f10 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
29f20 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29f30 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
29f40 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
29f50 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
29f60 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
29f70 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
29f80 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
29f90 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
29fa0 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
29fb0 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
29fc0 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
29fd0 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
29fe0 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
29ff0 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
2a000 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
2a010 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
2a020 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
2a030 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
2a040 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2a050 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2a060 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2a070 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
2a080 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
2a090 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
2a0a0 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
2a0b0 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
2a0c0 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
2a0d0 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
2a0e0 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
2a0f0 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
2a100 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2a110 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
2a120 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
2a130 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
2a140 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
2a150 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
2a160 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
2a170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2a180 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
2a190 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a1a0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2a1b0 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
2a1c0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a1d0 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74  .  return winGet
2a1e0 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
2a1f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
2a200 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f  Buf, zBuf);.}../
2a210 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2a220 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65  and deinitialize
2a230 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
2a240 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
2a250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2a260 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20  os_init(void){. 
2a270 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2a280 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20  vfs winVfs = {. 
2a290 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
2a2a0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2a2b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
2a2c0 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
2a2d0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
2a2e0 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
2a2f0 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
2a300 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
2a310 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2a320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2a330 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2a340 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ",             /
2a350 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
2a360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a370 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
2a380 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
2a390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a3a0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2a3b0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2a3c0 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
2a3d0 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
2a3e0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2a3f0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
2a400 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
2a410 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
2a420 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
2a430 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2a440 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
2a450 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
2a460 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2a470 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2a480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2a490 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2a4a0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2a4b0 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
2a4c0 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
2a4d0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
2a4e0 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
2a4f0 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
2a500 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
2a510 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2a520 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
2a530 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
2a540 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2a550 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
2a560 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  tError */.    wi
2a570 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2a580 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
2a590 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
2a5a0 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
2a5b0 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2a5c0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2a5d0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2a5e0 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
2a5f0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
2a600 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
2a610 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61  /* xNextSystemCa
2a620 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64  ll */.  };.#if d
2a630 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2a640 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2a650 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2a660 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66  fs winLongPathVf
2a670 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a690 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
2a6a0 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
2a6b0 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
2a6c0 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45  le */.    SQLITE
2a6d0 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
2a6e0 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68  BYTES, /* mxPath
2a6f0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
2a720 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68   "win32-longpath
2a730 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a  ",    /* zName *
2a740 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2a750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
2a760 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2a770 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2a780 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
2a790 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
2a7a0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
2a7b0 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
2a7c0 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
2a7d0 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
2a7e0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2a7f0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
2a800 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
2a810 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
2a820 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
2a830 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
2a840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2a850 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2a860 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
2a870 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
2a880 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
2a890 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2a8a0 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2a8b0 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2a8c0 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
2a8d0 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
2a8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2a8f0 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
2a900 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
2a910 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2a920 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
2a930 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
2a940 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
2a950 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2a960 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
2a970 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
2a980 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
2a990 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
2a9a0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
2a9b0 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
2a9c0 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
2a9d0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2a9e0 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
2a9f0 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
2aa00 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
2aa10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
2aa20 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74  ouble-check that
2aa30 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20   the aSyscall[] 
2aa40 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63  array has been c
2aa50 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
2aa60 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20  correctly.  See 
2aa70 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38  ticket [bb3a86e8
2aa80 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20  90c8e96ab] */.  
2aa90 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
2aaa0 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 36 20  e(aSyscall)==76 
2aab0 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d  );..  /* get mem
2aac0 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69  ory map allocati
2aad0 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a  on granularity *
2aae0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53  /.  memset(&winS
2aaf0 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ysInfo, 0, sizeo
2ab00 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b  f(SYSTEM_INFO));
2ab10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2ab20 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69  INRT.  osGetNati
2ab30 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  veSystemInfo(&wi
2ab40 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65  nSysInfo);.#else
2ab50 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  .  osGetSystemIn
2ab60 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
2ab70 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
2ab80 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  ( winSysInfo.dwA
2ab90 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
2aba0 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65  rity>0 );.  asse
2abb0 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  rt( winSysInfo.d
2abc0 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a  wPageSize>0 );..
2abd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
2abe0 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20  gister(&winVfs, 
2abf0 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  1);..#if defined
2ac00 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2ac10 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65  S_WIDE).  sqlite
2ac20 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
2ac30 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20  winLongPathVfs, 
2ac40 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  0);.#endif..  re
2ac50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2ac60 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
2ac70 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23  os_end(void){ .#
2ac80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2ac90 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62  RT.  if( sleepOb
2aca0 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  j!=NULL ){.    o
2acb0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
2acc0 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
2acd0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
2ace0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2acf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2ad00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ad10 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.