/ Hex Artifact Content
Login

Artifact e71678ac927d0a0fb11d993db20a9748eabf808e:


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 23  63].pCurrent)..#
7a00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7a10: 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  RT.  { "WaitForS
7a20: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
7a30: 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46    (SYSCALL)WaitF
7a40: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
7a50: 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ,   0 },.#else. 
7a60: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7a70: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7a80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7ab0: 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69  fine osWaitForSi
7ac0: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44  ngleObjectEx ((D
7ad0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7ae0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
7af0: 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73        BOOL))aSys
7b00: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
7b10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7b20: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74  S_WINRT.  { "Set
7b30: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
7b40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7b50: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
7b60: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
7b70: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
7b80: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7b90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7bc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
7bd0: 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42  ilePointerEx ((B
7be0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
7bf0: 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45  DLE,LARGE_INTEGE
7c00: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41  R, \.        PLA
7c10: 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52  RGE_INTEGER,DWOR
7c20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e  D))aSyscall[65].
7c30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7c40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7c50: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
7c60: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7c70: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46  ", (SYSCALL)GetF
7c80: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7c90: 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23  HandleEx, 0 },.#
7ca0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
7cb0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7cc0: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
7cd0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7ce0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7cf0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
7d00: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7d10: 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c  yHandleEx ((BOOL
7d20: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7d30: 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45  , \.        FILE
7d40: 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f  _INFO_BY_HANDLE_
7d50: 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f  CLASS,LPVOID,DWO
7d60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d  RD))aSyscall[66]
7d70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7d80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
7d90: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
7da0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
7db0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
7dc0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
7dd0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
7de0: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20  leFromApp,    0 
7df0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
7e00: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7e10: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
7e20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7e30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7e40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7e50: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
7e60: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57  omApp ((LPVOID(W
7e70: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55  INAPI*)(HANDLE,U
7e80: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a  LONG,ULONG64, \.
7e90: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
7ea0: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
7eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7ec0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7ed0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7ef0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c  ALL)CreateFile2,
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7f10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7f20: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
7f30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7f50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7f60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7f70: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41  CreateFile2 ((HA
7f80: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7f90: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
7fa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7fb0: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32     LPCREATEFILE2
7fc0: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
7fd0: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36  TERS))aSyscall[6
7fe0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
7ff0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8000: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
8010: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8020: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
8030: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8040: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
8050: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  L)LoadPackagedLi
8060: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a  brary,     0 },.
8070: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50  #else.  { "LoadP
8080: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
8090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
80c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
80d0: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
80e0: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  y ((HMODULE(WINA
80f0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a  PI*)(LPCWSTR, \.
8100: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
8110: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
8120: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8130: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8140: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
8150: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8160: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  LL)GetTickCount6
8170: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  4,          0 },
8180: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
8190: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
81a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
81b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
81c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
81d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
81e0: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28  etTickCount64 ((
81f0: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49  ULONGLONG(WINAPI
8200: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8210: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
8220: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8230: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74  INRT.  { "GetNat
8240: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
8250: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8260: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8270: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
8280: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8290: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
82a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
82d0: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69  define osGetNati
82e0: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  veSystemInfo ((V
82f0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
8300: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
8310: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
8320: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  71].pCurrent)..#
8330: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8340: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
8350: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8360: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
8370: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8380: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20  DebugStringA,   
8390: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
83a0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
83b0: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
83c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
83e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
83f0: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8400: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28  gStringA ((VOID(
8410: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
8420: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
8430: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
8440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8450: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
8460: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8470: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
8480: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8490: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  tringW,      0 }
84a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
84b0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
84c0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
84d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
84e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
84f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8500: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8510: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gW ((VOID(WINAPI
8520: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
8530: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
8540: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  t)..  { "GetProc
8550: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20  essHeap",       
8560: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
8570: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20  rocessHeap,     
8580: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
8590: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48  ne osGetProcessH
85a0: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  eap ((HANDLE(WIN
85b0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
85c0: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e  call[74].pCurren
85d0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
85e0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
85f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8600: 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74 65  WAL).  { "Create
8610: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
8620: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43 72  pp", (SYSCALL)Cr
8630: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8640: 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c  romApp, 0 },.#el
8650: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
8660: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
8670: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
86a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
86b0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
86c0: 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  App ((HANDLE(WIN
86d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
86e0: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
86f0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55 4c  TY_ATTRIBUTES,UL
8700: 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57  ONG,ULONG64,LPCW
8710: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 35  STR))aSyscall[75
8720: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
8730: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
8740: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
8750: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
8760: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
8770: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
8780: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
8790: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
87a0: 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56  the.** "win32" V
87b0: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
87c0: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
87d0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
87e0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
87f0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
8800: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
8810: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
8820: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
8830: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8840: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
8850: 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53 79  tic int winSetSy
8860: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
8870: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
8880: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
8890: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
88a0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
88b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
88c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
88d0: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
88e0: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
88f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
8900: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
8910: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
8920: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
8930: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
8940: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
8950: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
8960: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
8970: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
8980: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
8990: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
89a0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
89b0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
89c0: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
89d0: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
89e0: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
89f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
8a00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
8a10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8a20: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
8a30: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
8a40: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
8a50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
8a60: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
8a70: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
8a80: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8a90: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
8aa0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
8ab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
8ac0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
8ad0: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
8ae0: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
8af0: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
8b00: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
8b10: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
8b20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
8b30: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
8b40: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
8b50: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
8b60: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
8b70: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
8b80: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8b90: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
8ba0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
8bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
8bc0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8bd0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
8be0: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
8bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8c00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8c10: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
8c20: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
8c30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
8c40: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
8c50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8c60: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
8c70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8c80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8ca0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8cb0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
8cc0: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
8cd0: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
8ce0: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
8cf0: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
8d00: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
8d10: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
8d20: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
8d30: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
8d40: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
8d50: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
8d60: 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47  syscall_ptr winG
8d70: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
8d80: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
8d90: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
8da0: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
8db0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
8dc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8dd0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
8de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8df0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8e00: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8e10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8e20: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
8e30: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
8e40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
8e50: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
8e60: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
8e70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
8e80: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
8e90: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
8ea0: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
8eb0: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
8ec0: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
8ed0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8ee0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
8ef0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8f00: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
8f10: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
8f20: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
8f30: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
8f40: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
8f50: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
8f60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8f70: 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43   *winNextSystemC
8f80: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
8f90: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
8fa0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
8fb0: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
8fc0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
8fd0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
8fe0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
8ff0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
9000: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
9010: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
9020: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
9030: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
9040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9050: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
9060: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
9070: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
9080: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
9090: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
90a0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
90b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
90c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
90d0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
90e0: 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74  * If a Win32 nat
90f0: 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65 65  ive heap has bee
9100: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68  n configured, th
9110: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9120: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 63   attempt to.** c
9130: 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f 6e  ompact it.  Upon
9140: 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
9150: 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74 75  _OK will be retu
9160: 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69 6c  rned.  Upon fail
9170: 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53  ure, one.** of S
9180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c  QLITE_NOMEM, SQL
9190: 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51  ITE_ERROR, or SQ
91a0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 69  LITE_NOTFOUND wi
91b0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
91c0: 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 65   The.** "pnLarge
91d0: 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  st" argument, if
91e0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20   non-zero, will 
91f0: 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75 72  be used to retur
9200: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
9210: 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f 6d  e.** largest com
9220: 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f 63  mitted free bloc
9230: 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20 69  k in the heap, i
9240: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20  n bytes..*/.int 
9250: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63 6f  sqlite3_win32_co
9260: 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49 4e  mpact_heap(LPUIN
9270: 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20 20  T pnLargest){.  
9280: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9290: 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72 67  OK;.  UINT nLarg
92a0: 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c  est = 0;.  HANDL
92b0: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
92c0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
92d0: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
92e0: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
92f0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
9300: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
9310: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9320: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9330: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9340: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9350: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
9360: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
9370: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
9380: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
9390: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
93a0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
93b0: 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  f.#if !SQLITE_OS
93c0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
93d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
93e0: 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65 61   (nLargest=osHea
93f0: 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c 20  pCompact(hHeap, 
9400: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9410: 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b 0a  P_FLAGS))==0 ){.
9420: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
9430: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
9440: 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28 20  rror();.    if( 
9450: 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52  lastErrno==NO_ER
9460: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ROR ){.      sql
9470: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9480: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
9490: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 6e  o HeapCompact (n
94a0: 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d 25  o space), heap=%
94b0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
94c0: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
94d0: 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
94e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
94f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
9500: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9510: 45 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64  E_ERROR, "failed
9520: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20   to HeapCompact 
9530: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
9540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9550: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
9560: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
9570: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  p);.      rc = S
9580: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
9590: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73   }.  }.#else.  s
95a0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
95b0: 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69  E_NOTFOUND, "fai
95c0: 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61  led to HeapCompa
95d0: 63 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  ct, heap=%p",.  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
95f0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20  d*)hHeap);.  rc 
9600: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9610: 44 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  D;.#endif.  if( 
9620: 70 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c  pnLargest ) *pnL
9630: 61 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73  argest = nLarges
9640: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
9650: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69  }../*.** If a Wi
9660: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9670: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
9680: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9690: 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  on will attempt 
96a0: 74 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e  to.** destroy an
96b0: 64 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20  d recreate it.  
96c0: 49 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74  If the Win32 nat
96d0: 69 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20  ive heap is not 
96e0: 69 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a  isolated and/or.
96f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** the sqlite3_m
9700: 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e  emory_used() fun
9710: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
9720: 65 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49  eturn zero, SQLI
9730: 54 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20  TE_BUSY will.** 
9740: 62 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  be returned and 
9750: 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20  no changes will 
9760: 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57  be made to the W
9770: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9780: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9790: 5f 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61  _win32_reset_hea
97a0: 70 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  p(){.  int rc;. 
97b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
97c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
97d0: 73 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d  ster; ) /* The m
97e0: 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78  ain static mutex
97f0: 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   */.  MUTEX_LOGI
9800: 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
9810: 20 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20   *pMem; )    /* 
9820: 54 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69  The memsys stati
9830: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
9840: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
9850: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
9860: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
9870: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
9880: 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ); ).  MUTEX_LOG
9890: 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74  IC( pMem = sqlit
98a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
98b0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
98c0: 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74  _MEM); ).  sqlit
98d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
98e0: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
98f0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
9900: 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73  Mem);.  winMemAs
9910: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69  sertMagic();.  i
9920: 66 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  f( winMemGetHeap
9930: 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d  ()!=NULL && winM
9940: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20  emGetOwned() && 
9950: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9960: 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sed()==0 ){.    
9970: 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  /*.    ** At thi
9980: 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73  s point, there s
9990: 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73  hould be no outs
99a0: 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61  tanding memory a
99b0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20  llocations on.  
99c0: 20 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20    ** the heap.  
99d0: 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68  Also, since both
99e0: 20 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20   the master and 
99f0: 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65  memsys locks are
9a00: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
9a10: 2a 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  * being held by 
9a20: 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e  us, no other fun
9a30: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d  ction (i.e. from
9a40: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29   another thread)
9a50: 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62   should.    ** b
9a60: 65 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61  e able to even a
9a70: 63 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20  ccess the heap. 
9a80: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74   Attempt to dest
9a90: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
9aa0: 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c   our.    ** isol
9ab0: 61 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76  ated Win32 nativ
9ac0: 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20  e heap now..    
9ad0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  */.    assert( w
9ae0: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
9af0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
9b00: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  rt( winMemGetOwn
9b10: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9b20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9b30: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9b40: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
9b50: 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61  wn(winMemGetData
9b60: 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65  Ptr());.    asse
9b70: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  rt( winMemGetHea
9b80: 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20  p()==NULL );.   
9b90: 20 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d   assert( !winMem
9ba0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
9bb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9bc0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9bd0: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  =0 );.    rc = w
9be0: 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d  inMemInit(winMem
9bf0: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
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 77 69 6e 4d  QLITE_OK || winM
9c20: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
9c30: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
9c40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9c50: 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  | winMemGetOwned
9c60: 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  () );.    assert
9c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9c80: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  || sqlite3_memor
9c90: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
9ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20   }else{.    /*. 
9cb0: 20 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20     ** The Win32 
9cc0: 6e 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e  native heap cann
9cd0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62  ot be modified b
9ce0: 65 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65  ecause it may be
9cf0: 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   in use..    */.
9d00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9d10: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BUSY;.  }.  sqli
9d20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9d30: 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  pMem);.  sqlite3
9d40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
9d50: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
9d60: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
9d70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9d80: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
9d90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70  is function outp
9da0: 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65  uts the specifie
9db0: 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20  d (ANSI) string 
9dc0: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62  to the Win32 deb
9dd0: 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61  ugger.** (if ava
9de0: 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69  ilable)..*/..voi
9df0: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
9e00: 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73  write_debug(cons
9e10: 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e  t char *zBuf, in
9e20: 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20  t nBuf){.  char 
9e30: 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57  zDbgBuf[SQLITE_W
9e40: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
9e50: 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d  E];.  int nMin =
9e60: 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49   MIN(nBuf, (SQLI
9e70: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
9e80: 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20  _SIZE - 1)); /* 
9e90: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
9ea0: 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d   */.  if( nMin<-
9eb0: 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f  1 ) nMin = -1; /
9ec0: 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76  * all negative v
9ed0: 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e  alues become -1.
9ee0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   */.  assert( nM
9ef0: 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d  in==-1 || nMin==
9f00: 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45  0 || nMin<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 20 29 3b 0a 23 69 66 20 64 65 66 69 6e  IZE );.#if defin
9f30: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9f40: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
9f50: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
9f60: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
9f70: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
9f80: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
9f90: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
9fa0: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
9fb0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
9fc0: 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b  tringA(zDbgBuf);
9fd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73  .  }else{.    os
9fe0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
9ff0: 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  gA(zBuf);.  }.#e
a000: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
a010: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
a020: 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  E).  memset(zDbg
a030: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
a040: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
a050: 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c  E);.  if ( osMul
a060: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
a070: 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72  (.          osAr
a080: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
a090: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
a0a0: 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20  MCP, 0, zBuf,.  
a0b0: 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c          nMin, (L
a0c0: 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53  PWSTR)zDbgBuf, S
a0d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a0e0: 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28  BUF_SIZE/sizeof(
a0f0: 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20  WCHAR))<=0 ){.  
a100: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a110: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
a120: 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44  ingW((LPCWSTR)zD
a130: 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20  bgBuf);.#else.  
a140: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
a150: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
a160: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
a170: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
a180: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
a190: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
a1a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
a1b0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67  derr, "%s", zDbg
a1c0: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
a1d0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a1e0: 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  r, "%s", zBuf);.
a1f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
a200: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a210: 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e  g routine suspen
a220: 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ds the current t
a230: 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61  hread for at lea
a240: 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65  st ms.** millise
a250: 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20  conds.  This is 
a260: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
a270: 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20  e Win32 Sleep() 
a280: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
a290: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
a2a0: 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20  T.static HANDLE 
a2b0: 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
a2c0: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
a2d0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
a2e0: 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63  p(DWORD millisec
a2f0: 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54  onds){.#if SQLIT
a300: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20  E_OS_WINRT.  if 
a310: 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c  ( sleepObj==NULL
a320: 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a   ){.    sleepObj
a330: 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74   = osCreateEvent
a340: 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ExW(NULL, NULL, 
a350: 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e  CREATE_EVENT_MAN
a360: 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20  UAL_RESET,.     
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a380: 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
a390: 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61  RONIZE);.  }.  a
a3a0: 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21  ssert( sleepObj!
a3b0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69  =NULL );.  osWai
a3c0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
a3d0: 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c  Ex(sleepObj, mil
a3e0: 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45  liseconds, FALSE
a3f0: 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65  );.#else.  osSle
a400: 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  ep(milliseconds)
a410: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a420: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
a430: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
a440: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
a450: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
a460: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
a470: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
a480: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
a490: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
a4a0: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
a4b0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
a4c0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
a4d0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
a4e0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
a4f0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
a500: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
a510: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
a520: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
a530: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
a540: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
a550: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
a560: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
a570: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
a580: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
a590: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a5a0: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
a5b0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
a5c0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
a5d0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
a5e0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
a5f0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
a600: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
a610: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
a620: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a630: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
a640: 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51  ERSIONEX) || !SQ
a650: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
a660: 52 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65  RSIONEX.# define
a670: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a680: 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  elif SQLITE_OS_W
a690: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
a6a0: 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69  S_WINRT || !defi
a6b0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
a6c0: 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66  _HAS_ANSI).# def
a6d0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
a6e0: 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  ).#elif !defined
a6f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a700: 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65  S_WIDE).# define
a710: 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23   osIsNT()  (0).#
a720: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e  else.  static in
a730: 74 20 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a  t osIsNT(void){.
a740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
a750: 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 23 69  os_type==0 ){.#i
a760: 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f  f defined(NTDDI_
a770: 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44  VERSION) && NTDD
a780: 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44  I_VERSION >= NTD
a790: 44 49 5f 57 49 4e 38 0a 20 20 20 20 20 20 4f 53  DI_WIN8.      OS
a7a0: 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e  VERSIONINFOW sIn
a7b0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
a7c0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
a7d0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
a7e0: 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74  fo);.      osGet
a7f0: 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66  VersionExW(&sInf
a800: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  o);.#else.      
a810: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
a820: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66  Info;.      sInf
a830: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
a840: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
a850: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47  Info);.      osG
a860: 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49  etVersionExA(&sI
a870: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nfo);.#endif.   
a880: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79     sqlite3_os_ty
a890: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61  pe = sInfo.dwPla
a8a0: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41  tformId==VER_PLA
a8b0: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f  TFORM_WIN32_NT ?
a8c0: 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20   2 : 1;.    }.  
a8d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a8e0: 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d  _os_type==2;.  }
a8f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
a900: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
a910: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  LOC./*.** Alloca
a920: 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d  te nBytes of mem
a930: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
a940: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
a950: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  c(int nBytes){. 
a960: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
a970: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
a980: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
a990: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
a9a0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
a9b0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
a9c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
a9d0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
a9e0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
a9f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
aa00: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
aa10: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
aa20: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
aa30: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
aa40: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
aa50: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
aa60: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
aa70: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
aa80: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
aa90: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
aaa0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
aab0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
aac0: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
aad0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
aae0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
aaf0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
ab00: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
ab10: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
ab20: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
ab30: 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73        nBytes, os
ab40: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
ab50: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
ab60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
ab70: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
ab80: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
ab90: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
aba0: 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20  oid *pPrior){.  
abb0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20  HANDLE hHeap;.. 
abc0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
abd0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
abe0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
abf0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
ac00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ac10: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
ac20: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
ac30: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
ac40: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
ac50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
ac60: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
ac70: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
ac80: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
ac90: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
aca0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
acb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
acc0: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b  pPrior ) return;
acd0: 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c   /* Passing NULL
ace0: 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20   to HeapFree is 
acf0: 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20  undefined. */.  
ad00: 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28  if( !osHeapFree(
ad10: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
ad20: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
ad30: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73  pPrior) ){.    s
ad40: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ad50: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
ad60: 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f   to HeapFree blo
ad70: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
ad80: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
ad90: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f         pPrior, o
ada0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
adb0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
adc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
add0: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
ade0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f  an existing memo
adf0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ry allocation.*/
ae00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
ae10: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
ae20: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
ae30: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
ae40: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
ae50: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
ae60: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
ae70: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
ae80: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
ae90: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
aea0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
aeb0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
aec0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
aed0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
aee0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
aef0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
af00: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
af10: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
af20: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
af30: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
af40: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  r) );.#endif.  a
af50: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
af60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f   );.  if( !pPrio
af70: 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  r ){.    p = osH
af80: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
af90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
afa0: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
afb0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  )nBytes);.  }els
afc0: 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  e{.    p = osHea
afd0: 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  pReAlloc(hHeap, 
afe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
aff0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c  P_FLAGS, pPrior,
b000: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
b010: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29  ;.  }.  if( !p )
b020: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b030: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b040: 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75  "failed to %s %u
b050: 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65   bytes (%lu), he
b060: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
b070: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
b080: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
b090: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
b0a0: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
b0b0: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
b0c0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
b0d0: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
b0e0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
b0f0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
b100: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
b110: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
b120: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
b130: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
b140: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
b150: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
b160: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
b170: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b180: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b190: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b1a0: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b1b0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b1c0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b1d0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b1e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b1f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b200: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b210: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b220: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b230: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b240: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b250: 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  p) );.#endif.  i
b260: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
b270: 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69  ;.  n = osHeapSi
b280: 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ze(hHeap, SQLITE
b290: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b2a0: 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  S, p);.  if( n==
b2b0: 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20  (SIZE_T)-1 ){.  
b2c0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b2d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
b2e0: 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20  led to HeapSize 
b2f0: 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20  block %p (%lu), 
b300: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
b310: 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47            p, osG
b320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
b330: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b340: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b350: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b    return (int)n;
b360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20  .}../*.** Round 
b370: 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a  up a request siz
b380: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  e to the next va
b390: 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  lid allocation s
b3a0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
b3b0: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
b3c0: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
b3d0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n n;.}../*.** In
b3e0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
b3f0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
b400: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
b410: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
b420: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
b430: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
b440: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
b450: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
b460: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
b470: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b480: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b490: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
b4a0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
b4b0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b4c0: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
b4d0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
b4e0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b4f0: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
b500: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
b510: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
b520: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
b530: 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61    DWORD dwInitia
b540: 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  lSize = SQLITE_W
b550: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
b560: 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64  IZE;.    DWORD d
b570: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28  wMaximumSize = (
b580: 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f  DWORD)sqlite3Glo
b590: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b  balConfig.nHeap;
b5a0: 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d  .    if( dwMaxim
b5b0: 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  umSize==0 ){.   
b5c0: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
b5d0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
b5e0: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20  HEAP_MAX_SIZE;. 
b5f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49     }else if( dwI
b600: 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78  nitialSize>dwMax
b610: 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20  imumSize ){.    
b620: 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20    dwInitialSize 
b630: 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b  = dwMaximumSize;
b640: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
b650: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
b660: 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c  osHeapCreate(SQL
b670: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b680: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 77 49 6e              dwIn
b6b0: 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78  itialSize, dwMax
b6c0: 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69  imumSize);.    i
b6d0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
b6e0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20  >hHeap ){.      
b6f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b700: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
b710: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48      "failed to H
b720: 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c  eapCreate (%lu),
b730: 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53   flags=%u, initS
b740: 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65  ize=%lu, maxSize
b750: 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20  =%lu",.         
b760: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b770: 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ), SQLITE_WIN32_
b780: 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e  HEAP_FLAGS, dwIn
b790: 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20  itialSize,.     
b7a0: 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69       dwMaximumSi
b7b0: 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
b7c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b7d0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
b7e0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
b7f0: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
b800: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
b810: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
b820: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
b830: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
b840: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
b850: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
b860: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
b870: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b880: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
b890: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
b8a0: 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29  rocessHeap (%lu)
b8b0: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ", osGetLastErro
b8c0: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r());.    return
b8d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b8e0: 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61   }.  pWinMemData
b8f0: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
b900: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69  ;.  assert( !pWi
b910: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
b920: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
b930: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
b940: 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ->hHeap!=0 );.  
b950: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
b960: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
b970: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b980: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b990: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b9a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b9b0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b9c0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
b9d0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
b9e0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
b9f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
ba00: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
ba10: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
ba20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ba30: 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a  *.** Deinitializ
ba40: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
ba50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
ba60: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
ba70: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
ba80: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
ba90: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
baa0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
bab0: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
bac0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a  mData ) return;.
bad0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bae0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
baf0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
bb00: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bb10: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
bb20: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
bb30: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61  .  if( pWinMemDa
bb40: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
bb50: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bb60: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
bb70: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bb80: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bb90: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bbb0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bbc0: 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  E).    assert( o
bbd0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
bbe0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bbf0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
bc00: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
bc10: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
bc20: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
bc30: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20  bOwned ){.      
bc40: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72  if( !osHeapDestr
bc50: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  oy(pWinMemData->
bc60: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20  hHeap) ){.      
bc70: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bc80: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
bc90: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72  led to HeapDestr
bca0: 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  oy (%lu), heap=%
bcb0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
bcc0: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
bcd0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
bce0: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  )pWinMemData->hH
bcf0: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eap);.      }.  
bd00: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
bd10: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
bd30: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
bd40: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
bd50: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
bd60: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
bd70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
bd80: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
bd90: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
bda0: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
bdb0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
bdc0: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
bdd0: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
bde0: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
bdf0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
be00: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
be10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
be20: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
be30: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
be40: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
be50: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
be60: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
be70: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
be80: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
be90: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
bea0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
beb0: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74  in32(void){.  st
bec0: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
bed0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77  e3_mem_methods w
bee0: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b  inMemMethods = {
bef0: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  .    winMemMallo
bf00: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65  c,.    winMemFre
bf10: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61  e,.    winMemRea
bf20: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
bf30: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Size,.    winMem
bf40: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e  Roundup,.    win
bf50: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e  MemInit,.    win
bf60: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
bf70: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20   &win_mem_data. 
bf80: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
bf90: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  nMemMethods;.}..
bfa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
bfb0: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
bfc0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
bfd0: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
bfe0: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d  MALLOC, sqlite3M
bff0: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d  emGetWin32());.}
c000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c010: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
c020: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
c030: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
c040: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
c050: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20  code (UTF-16?). 
c060: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c070: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c080: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c090: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
c0a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
c0b0: 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  TR winUtf8ToUnic
c0c0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
c0d0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
c0e0: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
c0f0: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  R zWideFilename;
c100: 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  ..  nChar = osMu
c110: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c120: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
c130: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
c140: 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68  L, 0);.  if( nCh
c150: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ar==0 ){.    ret
c160: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69  urn 0;.  }.  zWi
c170: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  deFilename = sql
c180: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
c190: 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69  nChar*sizeof(zWi
c1a0: 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  deFilename[0]) )
c1b0: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c  ;.  if( zWideFil
c1c0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c1d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c1e0: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
c1f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
c200: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
c210: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
c220: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a          nChar);.
c250: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
c260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c270: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
c280: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
c290: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c2a0: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
c2b0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
c2c0: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
c2d0: 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   Unicode to UTF-
c2e0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
c2f0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c300: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
c310: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c320: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
c330: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
c340: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
c350: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
c360: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
c370: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
c380: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
c390: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
c3a0: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
c3b0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c3c0: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
c3d0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c3e0: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
c3f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
c400: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
c410: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
c420: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
c430: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c440: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
c450: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c460: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
c470: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
c480: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
c490: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
c4c0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c4d0: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
c4e0: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
c4f0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
c500: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
c510: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
c520: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c530: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f  n ANSI string to
c540: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c550: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  de, based on the
c560: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65  .** current code
c570: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f  page settings fo
c580: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20  r file apis..** 
c590: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c5a0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c5b0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c5c0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
c5d0: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  3_malloc..*/.sta
c5e0: 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62  tic LPWSTR winMb
c5f0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
c600: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
c610: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
c620: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46  .  LPWSTR zMbcsF
c630: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
c640: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
c650: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
c660: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
c670: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
c680: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c690: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
c6a0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
c6b0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28        0)*sizeof(
c6e0: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42  WCHAR);.  if( nB
c6f0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  yte==0 ){.    re
c700: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  turn 0;.  }.  zM
c710: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  bcsFilename = sq
c720: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
c730: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
c740: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
c750: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
c760: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
c770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c780: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
c790: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
c7a0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
c7b0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
c7c0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
c7f0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
c800: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c810: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
c820: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
c830: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
c840: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
c850: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
c860: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
c870: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
c880: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
c890: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
c8a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
c8b0: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
c8c0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c8d0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c8e0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c8f0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
c900: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
c910: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
c920: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
c930: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
c940: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
c950: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
c960: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
c970: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
c980: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
c990: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
c9a0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
c9b0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
c9c0: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
c9d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
c9e0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
c9f0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
ca00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ca10: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
ca20: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
ca30: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
ca40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
ca50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ca60: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
ca70: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
ca80: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
ca90: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
caa0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
cab0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
cae0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
caf0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cb00: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
cb10: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
cb20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
cb30: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
cb40: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
cb50: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
cb60: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
cb70: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
cb80: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
cb90: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cba0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cbb0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
cbc0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
cbd0: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
cbe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
cbf0: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
cc00: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
cc10: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
cc20: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
cc30: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
cc40: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
cc50: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
cc60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cc70: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55    }.  zFilenameU
cc80: 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  tf8 = winUnicode
cc90: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
cca0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
ccb0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
ccc0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
ccd0: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
cce0: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
ccf0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
cd00: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
cd10: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
cd20: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
cd30: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
cd40: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
cd50: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
cd60: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
cd70: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
cd80: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
cd90: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
cda0: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
cdb0: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
cdc0: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
cdd0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
cde0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
cdf0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
ce00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
ce10: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69  ilenameMbcs = wi
ce20: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a  nUnicodeToMbcs(z
ce30: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
ce40: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
ce50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69  e);.  return zFi
ce60: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f  lenameMbcs;.}../
ce70: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ce80: 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61  on sets the data
ce90: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68   directory or th
cea0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
ceb0: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a  ctory based on.*
cec0: 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61  * the provided a
ced0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74  rguments.  The t
cee0: 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ype argument mus
cef0: 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20  t be 1 in order 
cf00: 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61  to set the.** da
cf10: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
cf20: 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  2 in order to se
cf30: 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  t the temporary 
cf40: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20  directory.  The 
cf50: 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65  zValue.** argume
cf60: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
cf70: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
cf80: 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74  to use.  The ret
cf90: 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  urn value will b
cfa0: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  e.** SQLITE_OK i
cfb0: 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
cfc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
cfd0: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
cfe0: 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43  (DWORD type, LPC
cff0: 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20  WSTR zValue){.  
d000: 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f  char **ppDirecto
d010: 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ry = 0;.#ifndef 
d020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d030: 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20  INIT.  int rc = 
d040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
d050: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
d060: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
d070: 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  if.  if( type==S
d080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
d090: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
d0a0: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
d0b0: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61  ry = &sqlite3_da
d0c0: 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  ta_directory;.  
d0d0: 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d  }else if( type==
d0e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
d0f0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
d100: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
d110: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74  ory = &sqlite3_t
d120: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
d130: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70   }.  assert( !pp
d140: 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70  Directory || typ
d150: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d160: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d170: 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  YPE.          ||
d180: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d190: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
d1a0: 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61  RY_TYPE.  );.  a
d1b0: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
d1c0: 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65  ory || sqlite3Me
d1d0: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70  mdebugHasType(*p
d1e0: 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54  pDirectory, MEMT
d1f0: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69  YPE_HEAP) );.  i
d200: 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29  f( ppDirectory )
d210: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c  {.    char *zVal
d220: 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20  ueUtf8 = 0;.    
d230: 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56  if( zValue && zV
d240: 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  alue[0] ){.     
d250: 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69   zValueUtf8 = wi
d260: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
d270: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
d280: 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30   ( zValueUtf8==0
d290: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d2a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d2c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d2d0: 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  *ppDirectory);. 
d2e0: 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20     *ppDirectory 
d2f0: 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20  = zValueUtf8;.  
d300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d310: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
d320: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
d330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ../*.** The retu
d340: 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47  rn value of winG
d350: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
d360: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
d370: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
d380: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
d390: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
d3a0: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
d3b0: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
d3c0: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
d3d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
d3e0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f  LastErrorMsg(DWO
d3f0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e  RD lastErrno, in
d400: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
d410: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
d420: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
d430: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
d440: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
d450: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
d460: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
d470: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
d480: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
d490: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
d4a0: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
d4b0: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
d4c0: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
d4d0: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
d4e0: 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
d4f0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
d500: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52  _WINRT.    WCHAR
d510: 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54   zTempWide[SQLIT
d520: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
d530: 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20  SG_CHARS+1];.   
d540: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
d550: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
d560: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
d570: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
d5a0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
d5b0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
d640: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
d670: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
d680: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d6a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
d6b0: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
d6c0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
d6d0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
d6e0: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
d6f0: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
d700: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
d730: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
d760: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
d770: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
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 20 20 6c 61 73 74 45 72            lastEr
d7c0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
d810: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
d860: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
d870: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
d880: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
d890: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
d8a0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
d8b0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
d8c0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
d8d0: 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ut = winUnicodeT
d8e0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
d8f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d900: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d910: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
d920: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20  _WINRT.      /* 
d930: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
d940: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
d950: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
d960: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
d970: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
d980: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
d990: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
d9a0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
d9b0: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
d9c0: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
d9d0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
d9e0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
d9f0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
da00: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_BUFFER |. 
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
da30: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
da40: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
da70: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
da80: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
db10: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &zTemp,.   
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
db60: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
db70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
db80: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
db90: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
dba0: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
dbb0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
dbc0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
dbd0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
dbe0: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
dbf0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
dc00: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
dc10: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20  loc();.      /* 
dc20: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
dc30: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
dc40: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
dc50: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
dc60: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
dc70: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
dc80: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
dc90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dca0: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
dcb0: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
dcc0: 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74  %lx (%lu)", last
dcd0: 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f  Errno, lastErrno
dce0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dcf0: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75  /* copy a maximu
dd00: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20  m of nBuf chars 
dd10: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  to output buffer
dd20: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
dd30: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
dd40: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  Buf, "%s", zOut)
dd50: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68  ;.    /* free th
dd60: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f  e UTF8 buffer */
dd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dd80: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zOut);.  }.  r
dd90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
dda0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ddb0: 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  on - winLogError
ddc0: 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e  AtLine() - is on
ddd0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
dde0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
ddf0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  winLogError()..*
de00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
de10: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  e is invoked aft
de20: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
de30: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
de40: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73  tion..** It logs
de50: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
de60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
de70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
de80: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
de90: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
dea0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
deb0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
dec0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
ded0: 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73  m .** FormatMess
dee0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
def0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
df00: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
df10: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
df20: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
df30: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
df40: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
df50: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
df60: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
df70: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
df80: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
df90: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
dfa0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
dfb0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
dfc0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
dfd0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
dfe0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
dff0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
e000: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
e010: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
e020: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e030: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
e040: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
e050: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e060: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
e090: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
e0a0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0c0: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
e0d0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
e0e0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
e0f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e100: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
e110: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
e120: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
e130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e140: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
e150: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
e160: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
e190: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
e1a0: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
e1b0: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
e1c0: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
e1e0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
e1f0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
e200: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e220: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e230: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
e240: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
e250: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
e260: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
e270: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
e280: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
e290: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
e2a0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
e2b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
e2c0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
e2d0: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
e2e0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
e2f0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
e300: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
e310: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
e320: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
e330: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
e340: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
e350: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
e360: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
e370: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
e380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
e390: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
e3a0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
e3b0: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
e3c0: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
e3d0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
e3e0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
e3f0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
e400: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a  ably caused by .
e410: 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66  ** antivirus sof
e420: 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65  tware.  Also the
e430: 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62   initial delay b
e440: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
e450: 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65  retry..** The de
e460: 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69  lay increases li
e470: 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68  nearly with each
e480: 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64   retry..*/.#ifnd
e490: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
e4a0: 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65  IOERR_RETRY.# de
e4b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
e4c0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30  2_IOERR_RETRY 10
e4d0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
e4e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
e4f0: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23  RR_RETRY_DELAY.#
e500: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
e510: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e520: 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66  _DELAY 25.#endif
e530: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
e540: 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49  oerrRetry = SQLI
e550: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e560: 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74  ETRY;.static int
e570: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
e580: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  lay = SQLITE_WIN
e590: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
e5a0: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ELAY;../*.** If 
e5b0: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
e5c0: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
e5d0: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
e5e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
e5f0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
e600: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
e610: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
e620: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
e630: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
e640: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
e650: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
e660: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
e670: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
e680: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
e690: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
e6a0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
e6b0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
e6c0: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
e6d0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
e6e0: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
e6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
e700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  n 0;.  }.  if( e
e710: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  ==ERROR_ACCESS_D
e720: 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65  ENIED ||.      e
e730: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f  ==ERROR_LOCK_VIO
e740: 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20  LATION ||.      
e750: 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47  e==ERROR_SHARING
e760: 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20  _VIOLATION ){.  
e770: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
e780: 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65  sleep(winIoerrRe
e790: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
e7a0: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
e7b0: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
e7c0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
e7d0: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70  pError ){.    *p
e7e0: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20  Error = e;.  }. 
e7f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e800: 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72  .** Log a I/O er
e810: 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64  ror retry episod
e820: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
e830: 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e  d winLogIoerr(in
e840: 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28  t nRetry){.  if(
e850: 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73   nRetry ){.    s
e860: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
e870: 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20  E_IOERR, .      
e880: 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f  "delayed %dms fo
e890: 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63  r lock/sharing c
e8a0: 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20  onflict",.      
e8b0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
e8c0: 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72  ay*nRetry*(nRetr
e8d0: 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20  y+1)/2.    );.  
e8e0: 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  }.}..#if SQLITE_
e8f0: 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a  OS_WINCE./******
e900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e940: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74  ***.** This sect
e950: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ion contains cod
e960: 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79  e for WinCE only
e970: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
e980: 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f  d(SQLITE_MSVC_LO
e990: 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20  CALTIME_API) || 
e9a0: 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43  !SQLITE_MSVC_LOC
e9b0: 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a  ALTIME_API./*.**
e9c0: 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e   The MSVC CRT on
e9d0: 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20   Windows CE may 
e9e0: 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c  not have a local
e9f0: 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  time() function.
ea00: 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61    So.** create a
ea10: 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a   substitute..*/.
ea20: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
ea30: 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63  >.struct tm *__c
ea40: 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63  decl localtime(c
ea50: 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a  onst time_t *t).
ea60: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
ea70: 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49  t tm y;.  FILETI
ea80: 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53  ME uTm, lTm;.  S
ea90: 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20  YSTEMTIME pTm;. 
eaa0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
eab0: 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a  64;.  t64 = *t;.
eac0: 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31    t64 = (t64 + 1
ead0: 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30  1644473600)*1000
eae0: 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f  0000;.  uTm.dwLo
eaf0: 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f  wDateTime = (DWO
eb00: 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46  RD)(t64 & 0xFFFF
eb10: 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48  FFFF);.  uTm.dwH
eb20: 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57  ighDateTime= (DW
eb30: 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b  ORD)(t64 >> 32);
eb40: 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c  .  osFileTimeToL
eb50: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
eb60: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c  m,&lTm);.  osFil
eb70: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
eb80: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
eb90: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
eba0: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
ebb0: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
ebc0: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
ebd0: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
ebe0: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
ebf0: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
ec00: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
ec10: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
ec20: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
ec30: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
ec40: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
ec50: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e  return &y;.}.#en
ec60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e  dif..#define HAN
ec70: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61  DLE_TO_WINFILE(a
ec80: 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63  ) (winFile*)&((c
ec90: 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66  har*)a)[-(int)of
eca0: 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68  fsetof(winFile,h
ecb0: 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  )]../*.** Acquir
ecc0: 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  e a lock on the 
ecd0: 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74  handle h.*/.stat
ece0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74  ic void winceMut
ecf0: 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45  exAcquire(HANDLE
ed00: 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77   h){.   DWORD dw
ed10: 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20  Err;.   do {.   
ed20: 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74    dwErr = osWait
ed30: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
ed40: 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20  h, INFINITE);.  
ed50: 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20   } while (dwErr 
ed60: 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  != WAIT_OBJECT_0
ed70: 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49   && dwErr != WAI
ed80: 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a  T_ABANDONED);.}.
ed90: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
eda0: 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79  lock acquired by
edb0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
edc0: 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  re().*/.#define 
edd0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
ede0: 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65  e(h) ReleaseMute
edf0: 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  x(h)../*.** Crea
ee00: 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
ee10: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75   shared memory u
ee20: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
ee30: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64  in the file.** d
ee40: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a  escriptor pFile.
ee50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ee60: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
ee70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
ee80: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
ee90: 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a  ile){.  LPWSTR z
eea0: 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e  Tok;.  LPWSTR zN
eeb0: 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ame;.  DWORD las
eec0: 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62  tErrno;.  BOOL b
eed0: 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a  Logged = FALSE;.
eee0: 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54    BOOL bInit = T
eef0: 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  RUE;..  zName = 
ef00: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
ef10: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
ef20: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
ef30: 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d     /* out of mem
ef40: 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ory */.    retur
ef50: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
ef60: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
ef70: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
ef80: 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f  ocal lockdata */
ef90: 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65  .  memset(&pFile
efa0: 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65  ->local, 0, size
efb0: 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29  of(pFile->local)
efc0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65  );..  /* Replace
efd0: 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73   the backslashes
efe0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61   from the filena
eff0: 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65  me and lowercase
f000: 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69   it.  ** to deri
f010: 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e  ve a mutex name.
f020: 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43   */.  zTok = osC
f030: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
f040: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
f050: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
f060: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
f070: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
f080: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
f090: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
f0a0: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
f0b0: 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65  Mutex = osCreate
f0c0: 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c  MutexW(NULL, FAL
f0d0: 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  SE, zName);.  if
f0e0: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
f0f0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
f100: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f110: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
f120: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
f130: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
f140: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
f150: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
f160: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
f190: 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock1", zFilename
f1a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  );.  }..  /* Acq
f1b0: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62  uire the mutex b
f1c0: 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
f1d0: 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   */.  winceMutex
f1e0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
f1f0: 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20  Mutex);.  .  /* 
f200: 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20  Since the names 
f210: 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73  of named mutexes
f220: 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69  , semaphores, fi
f230: 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20  le mappings etc 
f240: 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73  are .  ** case-s
f250: 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61  ensitive, take a
f260: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74  dvantage of that
f270: 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20   by uppercasing 
f280: 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20  the mutex name. 
f290: 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68   ** and using th
f2a0: 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64  at as the shared
f2b0: 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d   filemapping nam
f2c0: 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72  e..  */.  osChar
f2d0: 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  UpperW(zName);. 
f2e0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
f2f0: 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
f300: 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48  ppingW(INVALID_H
f310: 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c  ANDLE_VALUE, NUL
f320: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f             PAGE_
f350: 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69  READWRITE, 0, si
f360: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c  zeof(winceLock),
f370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
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 7a 4e 61 6d 65 29 3b           zName);
f3a0: 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66    ..  /* Set a f
f3b0: 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74  lag that indicat
f3c0: 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72  es we're the fir
f3d0: 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  st to create the
f3e0: 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20   memory so it . 
f3f0: 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f   ** must be zero
f400: 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a  -initialized */.
f410: 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
f420: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
f430: 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20    if (lastErrno 
f440: 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59  == ERROR_ALREADY
f450: 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49  _EXISTS){.    bI
f460: 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d  nit = FALSE;.  }
f470: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
f480: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49  (zName);..  /* I
f490: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
f4a0: 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61  n making the sha
f4b0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
f4c0: 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20  e, map it. */.  
f4d0: 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  if( pFile->hShar
f4e0: 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ed ){.    pFile-
f4f0: 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65  >shared = (wince
f500: 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f  Lock*)osMapViewO
f510: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  fFile(pFile->hSh
f520: 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ared, .         
f530: 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41      FILE_MAP_REA
f540: 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  D|FILE_MAP_WRITE
f550: 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  , 0, 0, sizeof(w
f560: 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  inceLock));.    
f570: 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61  /* If mapping fa
f580: 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20  iled, close the 
f590: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
f5a0: 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69  ndle and erase i
f5b0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46  t */.    if( !pF
f5c0: 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20  ile->shared ){. 
f5d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f5e0: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f5f0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
f600: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
f610: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
f620: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
f640: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22  inceCreateLock2"
f650: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
f660: 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
f670: 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73  UE;.      osClos
f680: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
f690: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
f6a0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
f6b0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NULL;.    }.  }.
f6c0: 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20  .  /* If shared 
f6d0: 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74  memory could not
f6e0: 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65   be created, the
f6f0: 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  n close the mute
f700: 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20  x and fail */.  
f710: 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  if( pFile->hShar
f720: 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ed==NULL ){.    
f730: 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a  if( !bLogged ){.
f740: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f750: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
f760: 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  no;.      winLog
f770: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f780: 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
f790: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
f7a0: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
f7b0: 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c  eateLock3", zFil
f7c0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
f7d0: 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
f7e0: 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74    }.    winceMut
f7f0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
f800: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
f810: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
f820: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
f830: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
f840: 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NULL;.    return
f850: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
f860: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69   }.  .  /* Initi
f870: 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64  alize the shared
f880: 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65   memory if we're
f890: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a   supposed to */.
f8a0: 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20    if( bInit ){. 
f8b0: 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d     memset(pFile-
f8c0: 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65  >shared, 0, size
f8d0: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
f8e0: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
f8f0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
f900: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
f910: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f920: 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  /*.** Destroy th
f930: 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c  e part of winFil
f940: 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74  e that deals wit
f950: 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f  h wince locks.*/
f960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
f970: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69  ceDestroyLock(wi
f980: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
f990: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74   if (pFile->hMut
f9a0: 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75  ex){.    /* Acqu
f9b0: 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ire the mutex */
f9c0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41  .    winceMutexA
f9d0: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
f9e0: 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  utex);..    /* T
f9f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
fa00: 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  cks should proba
fa10: 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65  bly assert in de
fa20: 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68  bug mode, but th
fa30: 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f  ey.       are to
fa40: 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65   cleanup in case
fa50: 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69   any locks remai
fa60: 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20  ned open */.    
fa70: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
fa80: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
fa90: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
faa0: 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
fab0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
fac0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
fad0: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
fae0: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
faf0: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
fb00: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
fb10: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
fb20: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
fb30: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
fb40: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
fb50: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
fb60: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
fb70: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
fb80: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
fb90: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  e = FALSE;.    }
fba0: 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65  ..    /* De-refe
fbb0: 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20  rence and close 
fbc0: 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20  our copy of the 
fbd0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
fbe0: 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e  ndle */.    osUn
fbf0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
fc00: 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
fc10: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
fc20: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b  pFile->hShared);
fc30: 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69  ..    /* Done wi
fc40: 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  th the mutex */.
fc50: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
fc60: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
fc70: 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73  tex);    .    os
fc80: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
fc90: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
fca0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
fcb0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  NULL;.  }.}../* 
fcc0: 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
fcd0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
fce0: 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57  kFile() API of W
fcf0: 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
fd00: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
fd10: 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  ceLockFile(.  LP
fd20: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
fd30: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
fd40: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
fd50: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
fd60: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
fd70: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
fd80: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
fd90: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
fda0: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
fdb0: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
fdc0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
fdd0: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
fde0: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
fdf0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fe00: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
fe10: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
fe20: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
fe30: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
fe40: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
fe50: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
fe60: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
fe70: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
fe80: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
fe90: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
fea0: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
feb0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
fec0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
fed0: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
fee0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
fef0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
ff00: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
ff10: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
ff20: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
ff30: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
ff40: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
ff50: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
ff60: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
ff70: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
ff80: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
ff90: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
ffa0: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
ffb0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
ffc0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
ffd0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
ffe0: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
fff0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
10000 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10010 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
10020 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
10030 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
10040 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10050 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
10060 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
10070 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
10080 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
10090 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
100a0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
100b0 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
100c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
100d0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
100e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
100f0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10100 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10110 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
10120 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
10130 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
10140 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
10150 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20  DING_BYTE.      
10160 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
10170 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
10180 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
10190 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
101a0 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
101b0 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
101c0 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
101d0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
101e0 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
101f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10200 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
10210 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10220 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
10230 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
10240 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
10250 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
10260 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
10270 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
10280 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
10290 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
102a0 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
102b0 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
102c0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
102d0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
102e0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
102f0 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b  Reserved == 0) {
10300 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
10310 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
10320 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
10330 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
10340 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
10350 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
10360 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
10370 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
10380 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
10390 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
103a0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rn;.}../*.** An 
103b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
103c0 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  f the UnlockFile
103d0 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
103e0 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
103f0 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
10400 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
10410 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
10420 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
10430 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
10440 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
10450 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10460 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a  tesToUnlockLow,.
10470 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
10480 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
10490 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
104a0 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
104b0 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
104c0 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
104d0 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
104e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
104f0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
10500 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10510 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
10520 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
10530 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
10540 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
10550 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
10560 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
10570 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
10580 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61   Releasing a rea
10590 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65  der lock or an e
105a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
105b0 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
105c0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
105d0 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a  )SHARED_FIRST){.
105e0 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61      /* Did we ha
105f0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
10600 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20  lock? */.    if 
10610 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
10620 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
10630 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
10640 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
10650 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
10660 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  ED_SIZE);.      
10670 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
10680 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
10690 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
106a0 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
106b0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
106c0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
106d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
106e0 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61  d we just have a
106f0 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f   reader lock? */
10700 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46  .    else if (pF
10710 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
10720 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ers){.      asse
10730 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
10740 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
10750 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
10760 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE.             
10770 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  || nNumberOfByte
10780 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
10790 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  1);.      pFile-
107a0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
107b0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  --;.      if (pF
107c0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
107d0 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  ers == 0).      
107e0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
107f0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10800 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s --;.      }.  
10810 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
10820 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
10830 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
10840 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
10850 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
10860 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
10870 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54  WORD)PENDING_BYT
10880 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
10890 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
108a0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
108b0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
108c0 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
108d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
108e0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46  cal.bPending = F
108f0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
10900 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
10910 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
10920 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
10930 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  E;.    }.  }.  /
10940 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
10950 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  served lock */. 
10960 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
10970 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10980 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
10990 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
109a0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
109b0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
109c0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
109d0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
109e0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
109f0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
10a00 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
10a10 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
10a20 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
10a30 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
10a40 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
10a50 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
10a60 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
10a70 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
10a80 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  Return;.}./*.** 
10a90 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69  End of the speci
10aa0 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63  al code for winc
10ab0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
10ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
10b00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10b10 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f  E_OS_WINCE */../
10b20 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65  *.** Lock a file
10b30 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74   region..*/.stat
10b40 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46  ic BOOL winLockF
10b50 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
10b60 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
10b70 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f  flags,.  DWORD o
10b80 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
10b90 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
10ba0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
10bb0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
10bc0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
10bd0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
10be0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
10bf0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
10c00 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
10c10 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
10c20 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
10c30 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
10c40 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
10c50 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b  return winceLock
10c60 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
10c70 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
10c80 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
10c90 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
10ca0 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
10cb0 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
10cc0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
10cd0 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
10ce0 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
10cf0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
10d00 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
10d10 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
10d20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
10d30 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
10d40 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
10d50 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
10d60 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c  leEx(*phFile, fl
10d70 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ags, 0, numBytes
10d80 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
10d90 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
10da0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
10db0 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c  sLockFile(*phFil
10dc0 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
10dd0 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
10de0 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  esLow,.         
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
10e00 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
10e10 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10e20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  Unlock a file re
10e30 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  gion.. */.static
10e40 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46   BOOL winUnlockF
10e50 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
10e60 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
10e70 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
10e80 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
10e90 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
10ea0 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
10eb0 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
10ec0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
10ed0 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
10ee0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
10ef0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
10f00 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
10f10 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
10f20 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
10f30 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  UnlockFile..  */
10f40 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55  .  return winceU
10f50 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  nlockFile(phFile
10f60 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
10f70 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
10fa0 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
10fb0 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
10fc0 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
10fd0 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
10fe0 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
10ff0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
11000 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
11010 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
11020 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11030 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
11040 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
11050 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70  sUnlockFileEx(*p
11060 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
11070 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
11080 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
11090 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
110a0 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70   osUnlockFile(*p
110b0 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
110c0 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
110d0 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
11100 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
11110 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11160 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
11170 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70   of routines imp
11180 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d  lement the I/O m
11190 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64  ethods specified
111a0 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74  .** by the sqlit
111b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
111c0 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ject..**********
111d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11210 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ****/../*.** Som
11220 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
11230 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
11240 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
11250 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53  ifndef INVALID_S
11260 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
11270 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44  # define INVALID
11280 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
11290 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  R ((DWORD)-1).#e
112a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
112b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
112c0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ition of the fil
112d0 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
112e0 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
112f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66   argument to off
11300 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68  set iOffset with
11310 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  in the file. If 
11320 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
11330 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rn 0. .** Otherw
11340 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e  ise, set pFile->
11350 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65  lastErrno and re
11360 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
11370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11380 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65  SeekFile(winFile
11390 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33   *pFile, sqlite3
113a0 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b  _int64 iOffset){
113b0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
113c0 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70  WINRT.  LONG upp
113d0 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
113e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
113f0 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
11400 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
11410 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20  LONG lowerBits; 
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32  /* Least sig. 32
11440 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
11450 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  set */.  DWORD d
11460 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  wRet;           
11470 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
11480 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
11490 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a  tFilePointer() *
114a0 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
114b0 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
114c0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
114d0 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
114e0 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53  Error() */..  OS
114f0 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
11500 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
11510 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
11520 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70  iOffset));..  up
11530 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
11540 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26  ((iOffset>>32) &
11550 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
11560 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  lowerBits = (LON
11570 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66  G)(iOffset & 0xf
11580 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20  fffffff);..  /* 
11590 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73  API oddity: If s
115a0 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69  uccessful, SetFi
115b0 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75  lePointer() retu
115c0 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a  rns a dword .  *
115d0 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
115e0 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
115f0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
11600 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
11610 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
11620 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
11630 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
11640 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
11650 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20  ing to MSDN, .  
11660 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
11670 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
11680 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
11690 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
116a0 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
116b0 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
116c0 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
116d0 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20  occurred, it is 
116e0 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
116f0 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74  o call .  ** Get
11700 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a  LastError()..  *
11710 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  /.  dwRet = osSe
11720 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69  tFilePointer(pFi
11730 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73  le->h, lowerBits
11740 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
11750 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
11760 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49  ( (dwRet==INVALI
11770 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
11780 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61  ER.      && ((la
11790 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
117a0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
117b0 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70  ERROR)) ){.    p
117c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
117d0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
117e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
117f0 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
11800 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11820 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c    "winSeekFile",
11830 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11840 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45      OSTRACE(("SE
11850 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
11860 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
11870 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
11880 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
11890 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
118a0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
118b0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
118c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
118d0 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 0;.#else.  /
118e0 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61  *.  ** Same as a
118f0 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
11900 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  t this implement
11910 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20  ation works for 
11920 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c  WinRT..  */..  L
11930 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20  ARGE_INTEGER x; 
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11950 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74  * The new offset
11960 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b   */.  BOOL bRet;
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
11990 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
119a0 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f  lePointerEx() */
119b0 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d  ..  x.QuadPart =
119c0 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74   iOffset;.  bRet
119d0 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
119e0 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  terEx(pFile->h, 
119f0 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e  x, 0, FILE_BEGIN
11a00 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b  );..  if(!bRet){
11a10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11a20 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11a30 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69  tError();.    wi
11a40 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11a50 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
11a60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11a80 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
11a90 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
11aa0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
11ab0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11ac0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
11ad0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
11ae0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11af0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
11b00 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
11b10 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
11b20 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
11b30 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   0;.#endif.}..#i
11b40 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
11b50 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77  P_SIZE>0./* Forw
11b60 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
11b70 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74  o VFS helper met
11b80 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65  hods used for me
11b90 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65  mory mapped file
11ba0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
11bb0 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69  winMapfile(winFi
11bc0 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  le*, sqlite3_int
11bd0 36 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  64);.static int 
11be0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
11bf0 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  File*);.#endif..
11c00 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
11c10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  le..**.** It is 
11c20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e  reported that an
11c30 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   attempt to clos
11c40 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74  e a handle might
11c50 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61   sometimes.** fa
11c60 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76  il.  This is a v
11c70 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ery unreasonable
11c80 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e   result, but Win
11c90 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75  dows is notoriou
11ca0 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75  s.** for being u
11cb0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49  nreasonable so I
11cc0 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68   do not doubt th
11cd0 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70  at it might happ
11ce0 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63  en.  If.** the c
11cf0 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70  lose fails, we p
11d00 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c  ause for 100 mil
11d10 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
11d20 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20  y again.  As.** 
11d30 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45  many as MX_CLOSE
11d40 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74  _ATTEMPT attempt
11d50 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68  s to close the h
11d60 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62  andle are made b
11d70 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20  efore.** giving 
11d80 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
11d90 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64   an error..*/.#d
11da0 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41  efine MX_CLOSE_A
11db0 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20  TTEMPT 3.static 
11dc0 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c  int winClose(sql
11dd0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
11de0 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20    int rc, cnt = 
11df0 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  0;.  winFile *pF
11e00 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
11e10 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  id;..  assert( i
11e20 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  d!=0 );.#ifndef 
11e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11e40 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
11e50 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64  >pShm==0 );.#end
11e60 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  if.  assert( pFi
11e70 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  le->h!=NULL && p
11e80 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44  File->h!=INVALID
11e90 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
11ea0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
11eb0 53 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70  SE file=%p\n", p
11ec0 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20  File->h));..#if 
11ed0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
11ee0 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61  SIZE>0.  winUnma
11ef0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
11f00 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  ndif..  do{.    
11f10 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  rc = osCloseHand
11f20 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  le(pFile->h);.  
11f30 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45    /* SimulateIOE
11f40 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d  rror( rc=0; cnt=
11f50 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
11f60 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65  ; ); */.  }while
11f70 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74  ( rc==0 && ++cnt
11f80 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45   < MX_CLOSE_ATTE
11f90 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f  MPT && (sqlite3_
11fa0 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29  win32_sleep(100)
11fb0 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49  , 1) );.#if SQLI
11fc0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66  TE_OS_WINCE.#def
11fd0 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  ine WINCE_DELETI
11fe0 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20  ON_ATTEMPTS 3.  
11ff0 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
12000 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  (pFile);.  if( p
12010 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
12020 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  lose ){.    int 
12030 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
12040 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f  le(.           o
12050 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69  sDeleteFileW(pFi
12060 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
12070 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  se)==0.        &
12080 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  & osGetFileAttri
12090 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44  butesW(pFile->zD
120a0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30  eleteOnClose)!=0
120b0 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20  xffffffff .     
120c0 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49     && cnt++ < WI
120d0 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
120e0 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20  EMPTS.    ){.   
120f0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
12100 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f  2_sleep(100);  /
12110 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20  * Wait a little 
12120 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67  before trying ag
12130 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ain */.    }.   
12140 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
12150 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
12160 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
12170 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12180 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c   pFile->h = NULL
12190 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e  ;.  }.  OpenCoun
121a0 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41  ter(-1);.  OSTRA
121b0 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d  CE(("CLOSE file=
121c0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
121d0 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b  ile->h, rc ? "ok
121e0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
121f0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
12200 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
12210 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f      : winLogErro
12220 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  r(SQLITE_IOERR_C
12230 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOSE, osGetLastE
12240 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46    "winClose", pF
12270 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a  ile->zPath);.}..
12280 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
12290 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
122a0 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
122b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
122c0 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
122d0 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
122e0 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
122f0 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
12300 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
12310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12320 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  nRead(.  sqlite3
12330 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
12340 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72      /* File to r
12350 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f  ead from */.  vo
12360 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
12370 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
12380 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74  e content into t
12390 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
123a0 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
123b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
123c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
123d0 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74   read */.  sqlit
123e0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
123f0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
12400 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f  eading at this o
12410 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20  ffset */.){.#if 
12420 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
12430 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
12440 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
12450 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
12460 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a   for ReadFile. *
12470 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  /.#endif.  winFi
12480 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
12490 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
124a0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
124b0 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
124e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
124f0 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
12500 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12520 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
12530 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ys */..  assert(
12540 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
12550 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
12560 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
12570 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
12580 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
12590 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
125a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
125b0 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  D file=%p, buffe
125c0 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
125d0 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f   offset=%lld, lo
125e0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
125f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
12600 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74  Buf, amt, offset
12610 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
12620 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
12630 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
12640 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
12650 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
12660 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
12670 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
12680 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
12690 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
126a0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
126b0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
126c0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
126d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
126e0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
126f0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
12700 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
12710 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
12720 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
12730 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
12740 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
12750 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20  ACE(("READ-MMAP 
12760 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12770 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
12780 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
12790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
127a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
127b0 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
127c0 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
127d0 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
127e0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
127f0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
12800 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
12810 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
12820 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
12830 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
12840 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
12850 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
12860 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
12870 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
12880 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
12890 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69  .  if( winSeekFi
128a0 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
128b0 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  ) ){.    OSTRACE
128c0 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
128d0 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
128e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
128f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12900 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68  E_FULL;.  }.  wh
12910 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65  ile( !osReadFile
12920 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
12930 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29   amt, &nRead, 0)
12940 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73   ){.#else.  mems
12950 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
12960 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
12970 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61  PPED));.  overla
12980 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
12990 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
129a0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65  ffffffff);.  ove
129b0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
129c0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
129d0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
129e0 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28  fffff);.  while(
129f0 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
12a00 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
12a10 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c  , &nRead, &overl
12a20 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20  apped) &&.      
12a30 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
12a40 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  r()!=ERROR_HANDL
12a50 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a  E_EOF ){.#endif.
12a60 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
12a70 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e  rno;.    if( win
12a80 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  RetryIoerr(&nRet
12a90 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
12aa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12ab0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12ac0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
12ad0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
12ae0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12af0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e  ITE_IOERR_READ\n
12b00 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12b10 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
12b20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12b30 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e  RR_READ, pFile->
12b40 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69    "winRead", pFi
12b70 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
12b80 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52    winLogIoerr(nR
12b90 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65  etry);.  if( nRe
12ba0 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
12bb0 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
12bc0 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
12bd0 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
12be0 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
12bf0 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
12c00 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
12c10 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f  mt-nRead);.    O
12c20 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
12c30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12c40 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
12c50 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
12c60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12c70 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
12c80 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  READ;.  }..  OST
12c90 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65  RACE(("READ file
12ca0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
12cb0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12cc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12cd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E_OK;.}../*.** W
12ce0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
12cf0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
12d00 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
12d10 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
12d20 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
12d30 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
12d40 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
12d50 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
12d60 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
12d70 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
12d80 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
12d90 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
12da0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12dc0 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
12dd0 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
12de0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
12e10 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
12e20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
12e30 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
12e40 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
12e50 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
12e60 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
12e70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
12ea0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
12eb0 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f  d, else false */
12ec0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
12ed0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
12ee0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
12ef0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
12f00 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
12f10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12f20 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a   of retries */..
12f30 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
12f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
12f50 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
12f60 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
12f70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
12f80 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
12f90 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
12fa0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
12fb0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
12fc0 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75 66  ITE file=%p, buf
12fd0 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25  fer=%p, amount=%
12fe0 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  d, offset=%lld, 
12ff0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
13000 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
13010 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
13020 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
13030 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
13040 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
13050 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
13060 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
13070 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
13080 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
13090 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
130a0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
130b0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
130c0 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
130d0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
130e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
130f0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
13100 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
13110 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
13120 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
13130 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
13140 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
13150 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  f, amt);.      O
13160 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d  STRACE(("WRITE-M
13170 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  MAP file=%p, rc=
13180 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
13190 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
131a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
131b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
131c0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28     int nCopy = (
131d0 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70  int)(pFile->mmap
131e0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a  Size - offset);.
131f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
13200 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
13210 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
13220 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
13230 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
13240 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
13250 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
13260 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
13270 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
13280 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13290 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
132a0 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e 53  INCE.  rc = winS
132b0 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  eekFile(pFile, o
132c0 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
132d0 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b  ==0 ){.#else.  {
132e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
132f0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
13300 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
13310 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
13320 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
13330 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
13340 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
13350 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
13360 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
13370 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
13380 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
13390 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
133a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
133b0 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
133c0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
133d0 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
13400 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
13410 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
13420 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
13430 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
13440 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13450 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
13460 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
13470 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
13480 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
13490 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
134a0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
134b0 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
134c0 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
134d0 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
134e0 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
134f0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
13500 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
13510 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
13520 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69  .#endif..    whi
13530 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69  le( nRem>0 ){.#i
13540 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13550 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  E.      if( !osW
13560 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
13570 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
13580 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65  nWrite, 0) ){.#e
13590 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f  lse.      if( !o
135a0 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
135b0 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
135c0 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c   &nWrite, &overl
135d0 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66  apped) ){.#endif
135e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e  .        if( win
135f0 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  RetryIoerr(&nRet
13600 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
13610 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13630 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
13640 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
13650 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65  rite<=(DWORD)nRe
13660 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  m );.      if( n
13670 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69  Write==0 || nWri
13680 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  te>(DWORD)nRem )
13690 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
136a0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
136b0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
136c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
136d0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
136e0 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74  NCE.      offset
136f0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
13700 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
13710 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
13720 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
13730 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  );.      overlap
13740 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
13750 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
13760 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
13770 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  f);.#endif.     
13780 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
13790 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
137a0 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
137b0 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
137c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
137d0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
137e0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
137f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
13800 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
13810 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
13820 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
13830 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
13840 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
13850 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
13860 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
13870 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
13880 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20  "WRITE file=%p, 
13890 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
138a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
138b0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
138c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46  ogError(SQLITE_F
138d0 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ULL, pFile->last
138e0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69  "winWrite1", pFi
13910 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
13920 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  }.    OSTRACE(("
13930 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  WRITE file=%p, r
13940 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  c=SQLITE_IOERR_W
13950 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  RITE\n", pFile->
13960 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13970 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13980 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20  TE_IOERR_WRITE, 
13990 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
139a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
139b0 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69           "winWri
139c0 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
139d0 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
139e0 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52    winLogIoerr(nR
139f0 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  etry);.  }.  OST
13a00 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
13a10 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13a20 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
13a30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13a40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13a50 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
13a60 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
13a70 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
13a80 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63  tic int winTrunc
13a90 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
13aa0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
13ab0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69  t64 nByte){.  wi
13ac0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
13ad0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
13ae0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a   File handle obj
13af0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
13b00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13b10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13b20 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  rn code for this
13b30 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
13b40 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
13b50 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13b60 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
13b70 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
13b80 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
13b90 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
13ba0 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
13bb0 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f  p, size=%lld, lo
13bc0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
13bd0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e       pFile->h, n
13be0 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  Byte, pFile->loc
13bf0 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  ktype));..  /* I
13c00 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
13c10 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
13c20 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
13c30 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
13c40 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
13c50 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
13c60 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
13c70 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
13c80 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
13c90 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
13ca0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
13cb0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
13cc0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
13cd0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
13ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
13cf0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
13d00 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
13d10 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
13d20 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
13d30 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
13d40 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
13d50 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69  .  /* SetEndOfFi
13d60 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e  le() returns non
13d70 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65  -zero when succe
13d80 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77  ssful, or zero w
13d90 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  hen it fails. */
13da0 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69  .  if( winSeekFi
13db0 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
13dc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
13dd0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
13de0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
13df0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13e00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13e10 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
13e20 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate1", pFile->zP
13e30 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ath);.  }else if
13e40 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46  ( 0==osSetEndOfF
13e50 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26  ile(pFile->h) &&
13e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6c  .            ((l
13e70 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
13e80 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52  LastError())!=ER
13e90 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f  ROR_USER_MAPPED_
13ea0 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69  FILE) ){.    pFi
13eb0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
13ec0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
13ed0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
13ee0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
13ef0 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
13f00 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
13f20 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46  inTruncate2", pF
13f30 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
13f40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
13f50 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f  _MMAP_SIZE>0.  /
13f60 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
13f70 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  s truncated to a
13f80 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
13f90 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
13fa0 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67  .  ** mapped reg
13fb0 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20  ion, reduce the 
13fc0 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e  effective mappin
13fd0 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20  g size as well. 
13fe0 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a  SQLite will.  **
13ff0 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20   use read() and 
14000 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73  write() to acces
14010 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68  s data beyond th
14020 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f  is point from no
14030 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  w on..  */.  if(
14040 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
14050 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c  on && nByte<pFil
14060 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
14070 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
14080 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  ze = nByte;.  }.
14090 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
140a0 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c  E(("TRUNCATE fil
140b0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
140c0 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
140d0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
140e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
140f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
14100 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
14110 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
14120 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
14130 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
14140 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
14150 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
14160 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
14170 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72  ccuring at the r
14180 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69  ight times..*/.i
14190 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
141a0 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73  count = 0;.int s
141b0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
141c0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
141d0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
141e0 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
141f0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
14200 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
14210 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
14220 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28  tic int winSync(
14230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14240 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69  , int flags){.#i
14250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  fndef SQLITE_NO_
14260 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  SYNC.  /*.  ** U
14270 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51  sed only when SQ
14280 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
14290 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20  not defined..   
142a0 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65  */.  BOOL rc;.#e
142b0 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
142c0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65  d(NDEBUG) || !de
142d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f  fined(SQLITE_NO_
142e0 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28  SYNC) || \.    (
142f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
14300 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
14310 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20  SQLITE_DEBUG)). 
14320 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68   /*.  ** Used wh
14330 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  en SQLITE_NO_SYN
14340 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  C is not defined
14350 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65   and by the asse
14360 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a  rt() and/or.  **
14370 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f   OSTRACE() macro
14380 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69  s..   */.  winFi
14390 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
143a0 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a  File*)id;.#else.
143b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
143c0 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  ER(id);.#endif..
143d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
143e0 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  );.  /* Check th
143f0 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
14400 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
14410 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
14420 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
14430 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
14440 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
14450 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
14460 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
14470 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
14480 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
14490 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
144a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
144b0 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
144c0 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
144d0 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
144e0 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
144f0 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
14500 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
14510 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
14520 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
14530 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52  _FULL );..  OSTR
14540 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d  ACE(("SYNC file=
14550 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f  %p, flags=%x, lo
14560 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
14570 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66       pFile->h, f
14580 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  lags, pFile->loc
14590 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65  ktype));..#ifnde
145a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
145b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
145c0 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
145d0 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
145e0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
145f0 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
14600 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
14610 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
14620 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
14630 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
14640 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
14650 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
14660 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
14670 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
14680 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
14690 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
146a0 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  NC.  OSTRACE(("S
146b0 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c  YNC-NOP file=%p,
146c0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
146d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
146e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
146f0 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f  ;.#else.  rc = o
14700 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
14710 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53  s(pFile->h);.  S
14720 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
14730 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66  rc=FALSE );.  if
14740 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52  ( rc ){.    OSTR
14750 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d  ACE(("SYNC file=
14760 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14770 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14780 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14790 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
147a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
147b0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
147c0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54  Error();.    OST
147d0 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65  RACE(("SYNC file
147e0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
147f0 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70  OERR_FSYNC\n", p
14800 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
14810 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
14820 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
14830 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SYNC, pFile->las
14840 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14860 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d  winSync", pFile-
14870 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
14880 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
14890 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
148a0 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
148b0 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
148c0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
148d0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
148e0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
148f0 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
14900 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
14910 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
14920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14930 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
14940 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
14950 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20  t( pSize!=0 );. 
14960 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14970 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
14980 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f  OERR_FSTAT);.  O
14990 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
149a0 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c  le=%p, pSize=%p\
149b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53  n", pFile->h, pS
149c0 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ize));..#if SQLI
149d0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a  TE_OS_WINRT.  {.
149e0 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52      FILE_STANDAR
149f0 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20  D_INFO info;.   
14a00 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e   if( osGetFileIn
14a10 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
14a20 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69  eEx(pFile->h, Fi
14a30 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a  leStandardInfo,.
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65       &info, size
14a70 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20  of(info)) ){.   
14a80 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f     *pSize = info
14a90 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50  .EndOfFile.QuadP
14aa0 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
14ab0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
14ac0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
14ad0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
14ae0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
14af0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
14b00 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
14b10 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14b30 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
14b40 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
14b50 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b   }.  }.#else.  {
14b60 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72  .    DWORD upper
14b70 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
14b80 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44  lowerBits;.    D
14b90 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
14ba0 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  .    lowerBits =
14bb0 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70   osGetFileSize(p
14bc0 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42  File->h, &upperB
14bd0 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  its);.    *pSize
14be0 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
14bf0 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c  t64)upperBits)<<
14c00 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b  32) + lowerBits;
14c10 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65  .    if(   (lowe
14c20 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44  rBits == INVALID
14c30 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20  _FILE_SIZE).    
14c40 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
14c50 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14c60 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
14c70 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
14c80 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14c90 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
14ca0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
14cb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
14cc0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
14cd0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14cf0 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
14d00 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
14d10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
14d20 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65  RACE(("SIZE file
14d30 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a  =%p, pSize=%p, *
14d40 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25  pSize=%lld, rc=%
14d50 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
14d60 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
14d70 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65  , *pSize, sqlite
14d80 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
14d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14da0 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46  /*.** LOCKFILE_F
14db0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
14dc0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20  is undefined on 
14dd0 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73  some Windows sys
14de0 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
14df0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
14e00 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66  MMEDIATELY.# def
14e10 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  ine LOCKFILE_FAI
14e20 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a  L_IMMEDIATELY 1.
14e30 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
14e40 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
14e50 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  VE_LOCK.# define
14e60 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
14e70 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69  IVE_LOCK 2.#endi
14e80 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69  f../*.** Histori
14e90 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61  cally, SQLite ha
14ea0 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20  s used both the 
14eb0 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63  LockFile and Loc
14ec0 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
14ed0 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c  s..** When the L
14ee0 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e  ockFile function
14ef0 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61   was used, it wa
14f00 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  s always expecte
14f10 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d  d to fail.** imm
14f20 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
14f30 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
14f40 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73  e obtained.  Als
14f50 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70  o, it always exp
14f60 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61  ected to.** obta
14f70 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  in an exclusive 
14f80 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61  lock.  These fla
14f90 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  gs are used with
14fa0 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
14fb0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  function.** and 
14fc0 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78  reflect those ex
14fd0 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72  pectations; ther
14fe0 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75  efore, they shou
14ff0 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ld not be change
15000 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
15010 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
15020 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  AGS.# define SQL
15030 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
15040 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46  GS   (LOCKFILE_F
15050 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
15060 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45        LOCKFILE_E
15090 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23  XCLUSIVE_LOCK).#
150a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72  endif../*.** Cur
150b0 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e  rently, SQLite n
150c0 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c  ever calls the L
150d0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
150e0 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69  on without wanti
150f0 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  ng the.** call t
15100 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65  o fail immediate
15110 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
15120 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
15130 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
15140 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
15150 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
15160 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
15170 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45  _FLAGS (LOCKFILE
15180 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
15190 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Y).#endif../*.**
151a0 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65   Acquire a reade
151b0 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65  r lock..** Diffe
151c0 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65  rent API routine
151d0 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70  s are called dep
151e0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
151f0 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a  r or not this.**
15200 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e   is Win9x or Win
15210 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NT..*/.static in
15220 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b  t winGetReadLock
15230 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
15240 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f  {.  int res;.  O
15250 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
15260 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
15270 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
15280 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
15290 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  e));.  if( osIsN
152a0 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
152b0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f  E_OS_WINCE.    /
152c0 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
152d0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
152e0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
152f0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
15300 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
15310 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49      **       API
15320 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20   LockFileEx..   
15330 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69   */.    res = wi
15340 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nceLockFile(&pFi
15350 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
15360 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23  RST, 0, 1, 0);.#
15370 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77  else.    res = w
15380 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
15390 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
153a0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53  KFILEEX_FLAGS, S
153b0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
153e0 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  E, 0);.#endif.  
153f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
15400 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
15410 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c   else{.    int l
15420 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  k;.    sqlite3_r
15430 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
15440 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20  (lk), &lk);.    
15450 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
15460 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28  kByte = (short)(
15470 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66  (lk & 0x7fffffff
15480 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
15490 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20   1));.    res = 
154a0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
154b0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
154c0 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
154f0 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
15500 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
15510 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
15520 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20  f( res == 0 ){. 
15530 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15540 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15550 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e  rror();.    /* N
15560 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20  o need to log a 
15570 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20  failure to lock 
15580 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  */.  }.  OSTRACE
15590 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c  (("READ-LOCK fil
155a0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
155b0 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
155c0 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b  3ErrName(res)));
155d0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
155e0 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72  ../*.** Undo a r
155f0 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  eadlock.*/.stati
15600 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52  c int winUnlockR
15610 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
15620 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
15630 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  es;.  DWORD last
15640 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45  Errno;.  OSTRACE
15650 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
15660 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c  ile=%p, lock=%d\
15670 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
15680 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
15690 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
156a0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  ){.    res = win
156b0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
156c0 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
156d0 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
156e0 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64  ZE, 0);.  }.#ifd
156f0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
15700 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
15710 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
15720 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
15730 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
15740 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
15750 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
15760 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
15770 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c  f( res==0 && ((l
15780 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
15790 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52  LastError())!=ER
157a0 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20  ROR_NOT_LOCKED) 
157b0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
157c0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
157d0 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
157e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
157f0 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d  R_UNLOCK, pFile-
15800 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
15810 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15820 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c  UnlockReadLock",
15830 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
15840 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15850 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
15860 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
15870 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
15880 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a  ErrName(res)));.
15890 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
158a0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
158b0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
158c0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
158d0 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
158e0 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
158f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
15900 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
15910 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
15920 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
15930 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
15940 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
15950 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
15960 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
15970 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
15980 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
15990 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
159a0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
159b0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
159c0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
159d0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
159e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
159f0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
15a00 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
15a10 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
15a20 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
15a30 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
15a40 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
15a50 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
15a60 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
15a70 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
15a80 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
15a90 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
15aa0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
15ab0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
15ac0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
15ad0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
15ae0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
15af0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
15b00 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
15b10 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
15b20 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
15b30 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
15b40 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
15b50 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
15b60 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
15b70 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
15b80 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28    The winUnlock(
15b90 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61  ) routine.** era
15ba0 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74  ses all locks at
15bb0 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e   once and return
15bc0 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  s us immediately
15bd0 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
15be0 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  l 0..** It is no
15bf0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f  t possible to lo
15c00 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
15c10 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61  level one step a
15c20 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a  t a time.  You.*
15c30 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67  * must go straig
15c40 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ht to locking le
15c50 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  vel 0..*/.static
15c60 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c   int winLock(sql
15c70 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15c80 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
15c90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15ca0 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  OK;    /* Return
15cb0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f   code from subro
15cc0 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20  utines */.  int 
15cd0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
15ce0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
15cf0 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63  a Windows lock c
15d00 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  all */.  int new
15d10 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  Locktype;       
15d20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f  /* Set pFile->lo
15d30 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76  cktype to this v
15d40 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74  alue before exit
15d50 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74  ing */.  int got
15d60 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
15d70 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63  /* True if we ac
15d80 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47  quired a PENDING
15d90 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20   lock this time 
15da0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
15db0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
15dc0 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  id;.  DWORD last
15dd0 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
15de0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
15df0 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
15e00 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  ("LOCK file=%p, 
15e10 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20  oldLock=%d(%d), 
15e20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  newLock=%d\n",. 
15e30 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15e40 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
15e50 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
15e60 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b  edLockByte, lock
15e70 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  type));..  /* If
15e80 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
15e90 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
15ea0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
15eb0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
15ec0 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
15ed0 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
15ee0 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
15ef0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
15f00 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
15f10 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
15f20 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
15f30 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
15f40 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
15f50 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
15f60 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45  STRACE(("LOCK-HE
15f70 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  LD file=%p, rc=S
15f80 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
15f90 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
15fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15fb0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
15fc0 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
15fd0 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
15fe0 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
15ff0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
16000 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
16010 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
16020 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16030 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
16040 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
16050 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
16060 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
16070 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
16080 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16090 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50  .  /* Lock the P
160a0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
160b0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61   if we need to a
160c0 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
160d0 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20   lock or.  ** a 
160e0 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66  SHARED lock.  If
160f0 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e   we are acquirin
16100 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  g a SHARED lock,
16110 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   the acquisition
16120 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e   of.  ** the PEN
16130 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
16140 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a  s temporary..  *
16150 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20  /.  newLocktype 
16160 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
16170 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c  e;.  if(   (pFil
16180 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
16190 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20  LOCK).     || ( 
161a0 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43    (locktype==EXC
161b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20  LUSIVE_LOCK).   
161c0 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d        && (pFile-
161d0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
161e0 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  VED_LOCK)).  ){.
161f0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
16200 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
16210 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69  ->0 && (res = wi
16220 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16230 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
16240 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
16280 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
16290 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
162a0 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
162b0 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
162c0 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64    This is needed
162d0 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a   to work.      *
162e0 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  * around problem
162f0 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65  s caused by inde
16300 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69  xing and/or anti
16310 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20  -virus software 
16320 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64  on.      ** Wind
16330 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ows systems..   
16340 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65     ** If you are
16350 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65   using this code
16360 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20   as a model for 
16370 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65  alternative VFSe
16380 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20  s, do not.      
16390 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74  ** copy this ret
163a0 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73  ry logic.  It is
163b0 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64   a hack intended
163c0 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c   for Windows onl
163d0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
163e0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
163f0 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69  -PENDING-FAIL fi
16400 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
16410 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
16420 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16430 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33  >h, cnt, sqlite3
16440 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a  ErrName(res)));.
16450 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20        if( cnt ) 
16460 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
16470 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
16480 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
16490 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20   = res;.    if( 
164a0 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61  !res ){.      la
164b0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
164c0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
164d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
164e0 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ire a shared loc
164f0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
16500 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
16510 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
16520 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16530 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
16540 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
16550 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
16560 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
16570 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
16580 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
16590 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
165a0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
165b0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
165c0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
165d0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
165e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
165f0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
16600 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
16610 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
16620 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
16630 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
16640 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
16650 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
16660 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
16670 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
16680 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
16690 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
166a0 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
166b0 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
166c0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
166d0 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
166e0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
166f0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
16700 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
16710 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
16720 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16730 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
16740 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
16750 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
16760 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
16770 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
16780 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
16790 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
167a0 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
167b0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
167c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
167d0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
167e0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
167f0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
16800 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16810 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
16820 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d  File);.    res =
16830 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
16840 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
16850 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53  OCKFILE_FLAGS, S
16860 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
16890 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
168a0 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
168b0 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
168c0 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
168d0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
168e0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
168f0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
16900 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
16910 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
16920 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
16930 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
16940 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
16950 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
16960 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
16970 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
16980 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
16990 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
169a0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
169b0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
169c0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
169d0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
169e0 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
169f0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
16a00 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
16a10 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
16a20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
16a30 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
16a40 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
16a50 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
16a60 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
16a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
16a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16a90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
16aa0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
16ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16ac0 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  Y;.    OSTRACE((
16ad0 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
16ae0 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67  %p, wanted=%d, g
16af0 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot=%d\n",.      
16b00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16b10 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
16b20 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20  cktype));.  }.  
16b30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
16b40 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
16b50 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  e;.  OSTRACE(("L
16b60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
16b70 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
16b80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16b90 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
16ba0 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
16bb0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
16bc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16bd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
16be0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
16bf0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
16c00 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
16c10 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
16c20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
16c30 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
16c40 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
16c50 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  held, return.** 
16c60 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77  non-zero, otherw
16c70 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  ise zero..*/.sta
16c80 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b  tic int winCheck
16c90 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
16ca0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16cb0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
16cc0 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c  int rc;.  winFil
16cd0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
16ce0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
16cf0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
16d00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16d10 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
16d20 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  CK; );.  OSTRACE
16d30 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
16d40 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
16d50 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
16d60 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
16d70 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
16d80 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
16d90 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
16da0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  _LOCK ){.    rc 
16db0 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  = 1;.    OSTRACE
16dc0 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
16dd0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28  file=%p, rc=%d (
16de0 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
16df0 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c  ->h, rc));.  }el
16e00 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  se{.    rc = win
16e10 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16e20 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
16e30 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45  ILEEX_FLAGS,RESE
16e40 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
16e50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
16e60 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f  ){.      winUnlo
16e70 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
16e80 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16e90 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 1, 0);.    }
16ea0 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20  .    rc = !rc;. 
16eb0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
16ec0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
16ed0 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65  p, rc=%d (remote
16ee0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16ef0 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
16f00 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54  sOut = rc;.  OST
16f10 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
16f20 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
16f30 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
16f40 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
16f50 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
16f60 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73    pFile->h, pRes
16f70 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
16f80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16f90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
16fa0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
16fb0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
16fc0 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
16fd0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
16fe0 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
16ff0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
17000 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
17010 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
17020 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
17030 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17040 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
17050 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
17060 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
17070 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
17080 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17090 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
170a0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
170b0 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
170c0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
170d0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
170e0 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
170f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
17100 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
17110 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
17120 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
17130 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
17140 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
17150 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
17160 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
17170 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
17180 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
17190 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
171a0 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
171b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
171c0 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
171d0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
171e0 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
171f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
17200 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  NLOCK file=%p, o
17210 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
17220 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
17230 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
17240 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
17250 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
17260 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
17270 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  ype));.  type = 
17280 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
17290 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
172a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
172b0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
172c0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
172d0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
172e0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
172f0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
17300 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
17310 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
17320 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
17330 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
17340 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
17350 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
17360 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
17370 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
17380 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
17390 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
173a0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
173b0 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
173c0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70    "winUnlock", p
173f0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
17400 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
17410 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
17420 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
17430 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17440 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
17450 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
17460 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
17470 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
17480 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
17490 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64     winUnlockRead
174a0 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d  Lock(pFile);.  }
174b0 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
174c0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
174d0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
174e0 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
174f0 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
17500 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
17510 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
17520 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
17530 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  E(("UNLOCK file=
17540 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d  %p, lock=%d, rc=
17550 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
17560 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
17570 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c  e->locktype, sql
17580 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
17590 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
175a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
175b0 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79  g is inititially
175c0 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
175d0 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
175e0 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
175f0 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
17600 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
17610 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
17620 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17630 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
17640 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
17650 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
17660 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
17670 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
17680 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
17690 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74   void winModeBit
176a0 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
176b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
176c0 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
176d0 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
176e0 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
176f0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
17700 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
17710 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
17720 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
17730 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
17740 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
17750 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
17760 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
17770 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
17780 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
17790 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
177a0 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
177b0 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69  y files */.stati
177c0 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
177d0 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
177e0 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74   *, char **);.st
177f0 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
17800 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  r(const void *);
17810 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
17820 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
17830 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  Colon(const char
17840 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   *);../*.** Cont
17850 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
17860 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
17870 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
17880 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
17890 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
178a0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
178b0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
178c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
178d0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53  inFile*)id;.  OS
178e0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
178f0 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41  le=%p, op=%d, pA
17900 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  rg=%p\n", pFile-
17910 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a  >h, op, pArg));.
17920 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
17930 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
17940 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
17950 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
17960 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
17970 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53  cktype;.      OS
17980 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
17990 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
179a0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
179b0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
179c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
179d0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
179e0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
179f0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
17a00 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
17a10 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
17a20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
17a30 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
17a40 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
17a50 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
17a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17a70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
17a80 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
17a90 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
17aa0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
17ab0 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
17ac0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17ad0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17ae0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
17af0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
17b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17b20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
17b30 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
17b40 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
17b50 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unk>0 ){.       
17b60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
17b70 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  ldSz;.        in
17b80 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69  t rc = winFileSi
17b90 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a  ze(id, &oldSz);.
17ba0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
17bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17bc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
17bd0 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73  nt64 newSz = *(s
17be0 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41  qlite3_int64*)pA
17bf0 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rg;.          if
17c00 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b  ( newSz>oldSz ){
17c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
17c20 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
17c30 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(1);.         
17c40 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
17c50 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a  ate(id, newSz);.
17c60 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
17c70 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17c80 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(0);.          
17c90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17ca0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17cb0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17cc0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
17cd0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
17ce0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
17cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17d00 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
17d10 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
17d20 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17d30 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17d40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17d50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
17d60 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
17d70 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
17d80 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69  .      winModeBi
17d90 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45  t(pFile, WINFILE
17da0 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
17db0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
17dc0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
17dd0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
17de0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
17df0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
17e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17e10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
17e20 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
17e30 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
17e40 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
17e50 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
17e60 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
17e70 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
17e80 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
17e90 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
17ea0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
17eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17ec0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
17ed0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
17ee0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
17ef0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
17f00 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
17f10 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
17f20 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
17f30 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
17f40 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
17f50 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
17f60 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
17f70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17f80 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
17f90 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
17fa0 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
17fb0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
17fc0 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
17fd0 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
17fe0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65  {.        winIoe
17ff0 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a  rrRetry = a[0];.
18000 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18010 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49       a[0] = winI
18020 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
18030 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
18040 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
18050 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
18060 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
18070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
18080 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [1] = winIoerrRe
18090 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20  tryDelay;.      
180a0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
180b0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
180c0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
180d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
180e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
180f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18100 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18110 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
18120 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
18130 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  File = 0;.      
18140 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54  int rc = winGetT
18150 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
18160 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20  Vfs, &zTFile);. 
18170 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18190 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
181a0 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
181b0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
181c0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
181d0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
181e0 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
181f0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
18200 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18210 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
18220 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
18230 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18240 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
18250 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
18260 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
18270 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
18280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18290 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
182a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
182b0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
182c0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
182d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
182e0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
182f0 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
18300 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
18310 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
18320 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
18330 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
18340 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
18350 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
18360 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
18370 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
18380 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
18390 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
183a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
183b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69   ){.          wi
183c0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  nUnmapfile(pFile
183d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
183e0 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69  = winMapfile(pFi
183f0 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
18400 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18410 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18420 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
18430 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
18440 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18450 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18460 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
18470 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  f.  }.  OSTRACE(
18480 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18490 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   rc=SQLITE_NOTFO
184a0 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  UND\n", pFile->h
184b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
184c0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
184d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
184e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
184f0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
18500 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
18510 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
18520 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
18530 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
18540 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
18550 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
18560 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
18570 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
18580 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
18590 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
185a0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
185b0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
185c0 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
185d0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
185e0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
185f0 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
18600 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
18610 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
18620 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
18630 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
18640 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
18650 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
18660 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
18670 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
18680 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28  3_file *id){.  (
18690 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72  void)id;.  retur
186a0 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
186b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
186c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
186d0 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
186e0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
186f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18700 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
18710 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
18720 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69  _file *id){.  wi
18730 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46  nFile *p = (winF
18740 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72  ile*)id;.  retur
18750 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  n SQLITE_IOCAP_U
18760 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
18770 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20  OPEN |.         
18780 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ((p->ctrlFlags &
18790 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53   WINFILE_PSOW)?S
187a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
187b0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
187c0 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69  0);.}../* .** Wi
187d0 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20  ndows will only 
187e0 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66  let you create f
187f0 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67  ile view mapping
18800 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69  s.** on allocati
18810 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72  on size granular
18820 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a  ity boundaries..
18830 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65  ** During sqlite
18840 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64  3_os_init() we d
18850 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66  o a GetSystemInf
18860 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  o().** to get th
18870 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69  e granularity si
18880 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59  ze..*/.static SY
18890 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
188a0 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53  Info;..#ifndef S
188b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
188c0 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
188d0 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
188e0 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
188f0 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
18900 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
18910 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
18920 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
18930 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
18940 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69   used by .** thi
18950 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
18960 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72  hich may be shar
18970 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
18980 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
18990 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74  nction winShmMut
189a0 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
189b0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
189c0 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
189d0 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
189e0 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
189f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
18a00 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
18a10 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
18a20 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
18a30 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ..**.**   winShm
18a40 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
18a50 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53      assert( winS
18a60 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
18a70 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76  .**   winShmLeav
18a80 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74  eMutex().*/.stat
18a90 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e  ic void winShmEn
18aa0 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
18ab0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18ac0 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
18ad0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
18ae0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
18af0 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
18b00 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  oid winShmLeaveM
18b10 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
18b20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18b30 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
18b40 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
18b50 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
18b60 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
18b70 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  UG.static int wi
18b80 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f  nShmMutexHeld(vo
18b90 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
18ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18bb0 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
18bc0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
18bd0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
18be0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18bf0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
18c00 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e   represent a sin
18c10 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  gle file opened 
18c20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70  and mmapped to p
18c30 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64  rovide.** shared
18c40 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d   memory.  When m
18c50 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
18c60 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
18c70 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75  e same.** log-su
18c80 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65  mmary, each thre
18c90 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77  ad has its own w
18ca0 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  inFile object, b
18cb0 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
18cc0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
18cd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
18ce0 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
18cf0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
18d00 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
18d10 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
18d20 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
18d30 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  **.** winShmMute
18d40 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
18d50 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
18d60 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
18d70 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
18d80 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
18d90 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
18da0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
18db0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
18dc0 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20  f.**      pNext 
18dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
18de0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
18df0 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
18e00 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
18e10 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
18e20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
18e30 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
18e40 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ither winShmNode
18e50 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  .mutex must be h
18e60 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64  eld or winShmNod
18e70 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
18e80 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
18e90 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
18ea0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
18eb0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
18ec0 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
18ed0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73  ructure..**.*/.s
18ee0 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
18ef0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   {.  sqlite3_mut
18f00 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
18f10 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
18f20 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
18f30 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
18f40 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
18f50 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
18f60 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  le */.  winFile 
18f70 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  hFile;          
18f80 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
18f90 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a  e from winOpen *
18fa0 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  /..  int szRegio
18fb0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
18fc0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
18fd0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
18fe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f   */.  int nRegio
18ff0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
19000 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
19010 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
19020 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
19030 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d   {.    HANDLE hM
19040 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
19050 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
19060 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61  rom CreateFileMa
19070 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69  pping */.    voi
19080 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52  d *pMap;.  } *aR
19090 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c  egion;.  DWORD l
190a0 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
190b0 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
190c0 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
190d0 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
190e0 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b   */..  int nRef;
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
19110 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
19120 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
19130 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72  /.  winShm *pFir
19140 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
19150 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a  * All winShm obj
19160 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
19170 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
19180 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20  mNode *pNext;   
19190 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e        /* Next in
191a0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e   list of all win
191b0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20  ShmNode objects 
191c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
191d0 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74  _DEBUG.  u8 next
191e0 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
191f0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
19200 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20  lable winShm.id 
19210 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
19220 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  };../*.** A glob
19230 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20  al array of all 
19240 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
19250 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69  ts..**.** The wi
19260 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
19270 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69  must be true whi
19280 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
19290 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e  iting this list.
192a0 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68  .*/.static winSh
192b0 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64  mNode *winShmNod
192c0 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
192d0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
192e0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
192f0 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
19300 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
19310 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
19320 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
19330 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
19340 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
19350 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
19360 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
19370 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
19380 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
19390 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
193a0 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d  *    winShm.pShm
193b0 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68  Node.**    winSh
193c0 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
193d0 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
193e0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
193f0 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
19400 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
19410 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
19420 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
19430 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
19440 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20  /.struct winShm 
19450 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
19460 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f  pShmNode;      /
19470 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
19480 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
19490 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ct */.  winShm *
194a0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
194b0 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68     /* Next winSh
194c0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
194d0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
194e0 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
194f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19500 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
19510 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74  e winShmNode mut
19520 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  ex */.  u16 shar
19530 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
19540 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
19550 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
19560 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
19570 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19580 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
19590 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
195a0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
195b0 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20  _DEBUG.  u8 id; 
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
195e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
195f0 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
19600 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
19610 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
19620 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
19630 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
19640 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
19650 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
19660 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
19670 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
19680 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
19690 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
196a0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
196b0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
196c0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
196d0 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
196e0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
196f0 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
19700 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
19710 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
19720 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
19730 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
19740 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
19750 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
19760 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
19770 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
19780 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
19790 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
197a0 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
197b0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
197c0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
197d0 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
197e0 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
197f0 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
19800 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
19810 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
19820 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
19830 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
19840 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
19850 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
19860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
19870 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
19880 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nlock */.){.  in
19890 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
198a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
198b0 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
198c0 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
198d0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
198e0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
198f0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
19900 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
19910 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
19920 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19930 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
19940 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
19950 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
19960 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
19970 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73  p, lock=%d, offs
19980 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e  et=%d, size=%d\n
19990 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
199a0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f  ile->hFile.h, lo
199b0 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42  ckType, ofst, nB
199c0 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  yte));..  /* Rel
199d0 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65  ease/Acquire the
199e0 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
199f0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  ck */.  if( lock
19a00 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
19a10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
19a20 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
19a30 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74  e->hFile.h, ofst
19a40 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
19a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19a60 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
19a70 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
19a80 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64  s */.    DWORD d
19a90 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
19aa0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
19ab0 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  LY;.    if( lock
19ac0 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c  Type == _SHM_WRL
19ad0 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
19ae0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
19af0 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  VE_LOCK;.    rc 
19b00 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
19b10 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
19b20 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c  wFlags, ofst, 0,
19b30 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a   nByte, 0);.  }.
19b40 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20    .  if( rc!= 0 
19b50 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19b60 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
19b70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19b80 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73  rrno =  osGetLas
19b90 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
19ba0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19bb0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
19bc0 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
19bd0 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e  p, func=%s, errn
19be0 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c  o=%lu, rc=%s\n",
19bf0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19c00 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63  e->hFile.h, (loc
19c10 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e  kType == _SHM_UN
19c20 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63  LCK) ? "winUnloc
19c30 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20  kFile" :.       
19c40 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65      "winLockFile
19c50 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  ", pFile->lastEr
19c60 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  rno, sqlite3ErrN
19c70 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65  ame(rc)));..  re
19c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
19c90 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
19ca0 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
19cb0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
19cc0 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
19cd0 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
19ce0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
19cf0 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
19d00 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
19d10 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
19d20 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
19d30 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
19d40 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
19d50 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
19d60 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
19d70 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
19d80 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
19d90 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
19da0 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
19db0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
19dc0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
19dd0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
19de0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
19df0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
19e00 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
19e10 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
19e20 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
19e30 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
19e40 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61  nShmNode *p;.  a
19e50 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
19e60 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
19e70 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
19e80 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
19e90 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
19ea0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
19eb0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
19ec0 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
19ed0 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
19ee0 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
19ef0 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
19f00 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
19f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
19f20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
19f30 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33  mutex ){ sqlite3
19f40 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
19f50 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66  utex); }.      f
19f60 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
19f70 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
19f80 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f      BOOL bRc = o
19f90 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
19fa0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
19fb0 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
19fc0 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
19fd0 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c  E-UNMAP pid=%lu,
19fe0 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
19ff0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1a000 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1a010 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1a020 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1a030 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1a040 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1a050 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1a060 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73          bRc = os
1a070 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
1a080 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
1a090 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1a0a0 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f  (("SHM-PURGE-CLO
1a0b0 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  SE pid=%lu, regi
1a0c0 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  on=%d, rc=%s\n",
1a0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a0e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1a0f0 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52  ocessId(), i, bR
1a100 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
1a110 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  ed"));.        U
1a120 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56  NUSED_VARIABLE_V
1a130 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20  ALUE(bRc);.     
1a140 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
1a150 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
1a160 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
1a170 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1a180 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
1a190 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a1a0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
1a1b0 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
1a1c0 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
1a1d0 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
1a1e0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a1f0 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
1a200 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
1a210 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
1a220 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a230 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1a240 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
1a250 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
1a260 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
1a270 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
1a280 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1a290 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1a2a0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
1a2b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1a2c0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1a2d0 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
1a2e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
1a2f0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
1a300 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
1a310 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1a320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a330 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
1a340 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1a350 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
1a360 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1a370 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
1a380 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
1a390 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
1a3a0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
1a3b0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
1a3c0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
1a3d0 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
1a3e0 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
1a3f0 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
1a400 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
1a410 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1a420 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
1a430 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
1a440 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
1a450 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
1a460 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
1a470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a480 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
1a490 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
1a4a0 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
1a4b0 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
1a4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1a4d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1a4e0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
1a4f0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1a500 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
1a510 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1a520 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
1a530 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a550 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1a560 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
1a570 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
1a580 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
1a590 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
1a5a0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1a5b0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
1a5e0 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
1a5f0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1a600 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
1a610 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
1a620 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
1a630 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1a640 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
1a650 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
1a660 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
1a670 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
1a680 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
1a690 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
1a6a0 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
1a6b0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
1a6c0 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1a6d0 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
1a6e0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1a6f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1a700 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1a710 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
1a720 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
1a730 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1a740 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
1a750 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
1a760 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
1a770 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
1a780 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1a790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1a7a0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1a7b0 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
1a7c0 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
1a7d0 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
1a7e0 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
1a7f0 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1a800 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
1a810 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
1a820 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
1a830 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
1a840 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
1a850 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20   ..  /* Look to 
1a860 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
1a870 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
1a880 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
1a890 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
1a8a0 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
1a8b0 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
1a8c0 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
1a8d0 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
1a8e0 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1a8f0 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
1a900 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
1a910 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
1a920 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
1a930 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
1a940 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
1a950 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
1a960 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
1a970 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
1a980 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
1a990 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
1a9a0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
1a9b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1a9c0 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
1a9d0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
1a9e0 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
1a9f0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
1aa00 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
1aa10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1aa20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1aa30 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
1aa40 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
1aa50 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
1aa60 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
1aa70 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
1aa80 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
1aa90 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
1aaa0 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
1aab0 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
1aac0 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
1aad0 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
1aae0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1aaf0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1ab00 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1ab10 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
1ab20 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
1ab30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ab40 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1ab50 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1ab60 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1ab70 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70    rc = winOpen(p
1ab80 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20  DbFd->pVfs,.    
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
1aba0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1abb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1abc0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1abd0 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20  e (UTF-8) */.   
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1abf0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53  qlite3_file*)&pS
1ac00 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20  hmNode->hFile,  
1ac10 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68  /* File handle h
1ac20 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ere */.         
1ac30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1ac40 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45  PEN_WAL | SQLITE
1ac50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1ac60 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
1ac70 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  EATE,.          
1ac80 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
1ac90 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1aca0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1acb0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1acc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
1acd0 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1ace0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
1acf0 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
1ad00 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
1ad10 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
1ad20 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1ad30 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
1ad40 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
1ad50 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1ad60 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
1ad70 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1ad80 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1ad90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1ada0 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1adb0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1adc0 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
1add0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ade0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1adf0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1ae00 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1ae10 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
1ae20 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
1ae50 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1ae60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ae70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ae80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
1ae90 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1aea0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1aeb0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1aec0 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
1aed0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1aee0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1aef0 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
1af00 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
1af10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1af20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1af30 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
1af40 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
1af50 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
1af60 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
1af70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
1af80 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
1af90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
1afa0 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
1afb0 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
1afc0 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
1afd0 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
1afe0 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
1aff0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1b000 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1b010 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1b020 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1b030 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1b040 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1b050 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
1b060 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1b070 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
1b080 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
1b090 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
1b0a0 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
1b0b0 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
1b0c0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
1b0d0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
1b0e0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
1b0f0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
1b100 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
1b110 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
1b120 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
1b130 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
1b140 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
1b150 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
1b160 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1b170 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
1b180 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1b190 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1b1a0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
1b1b0 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
1b1c0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
1b1d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
1b1e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1b1f0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1b200 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1b220 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
1b230 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
1b240 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
1b250 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1b260 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1b270 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1b280 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
1b290 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1b2a0 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
1b2b0 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
1b2c0 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
1b2d0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
1b2e0 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
1b2f0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1b300 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1b310 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
1b320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1b330 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
1b340 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
1b350 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
1b360 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
1b370 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
1b380 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
1b390 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
1b3a0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1b3b0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1b3c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1b3d0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1b3e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
1b3f0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
1b400 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
1b410 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
1b420 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
1b430 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
1b440 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1b450 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
1b460 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
1b470 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1b480 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1b490 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
1b4a0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1b4b0 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
1b4c0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
1b4d0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1b4e0 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
1b4f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1b500 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
1b510 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
1b520 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
1b530 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
1b540 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1b550 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1b560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b570 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1b580 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
1b590 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
1b5a0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
1b5b0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
1b5c0 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
1b5d0 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
1b5e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1b5f0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1b600 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
1b610 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
1b620 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
1b630 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
1b640 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
1b650 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
1b660 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
1b670 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1b680 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
1b690 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
1b6a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b6b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1b6c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
1b6d0 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
1b6e0 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
1b6f0 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1b700 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
1b710 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
1b720 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1b730 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
1b740 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
1b750 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
1b760 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
1b770 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1b780 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
1b790 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
1b7a0 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
1b7b0 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
1b7c0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
1b7d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b7e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1b7f0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
1b800 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
1b810 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
1b820 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
1b830 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
1b840 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1b850 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1b860 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
1b870 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1b880 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b8a0 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
1b8b0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1b8c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
1b8f0 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
1b900 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1b910 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
1b920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
1b930 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
1b940 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
1b950 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
1b960 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
1b970 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1b980 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
1b990 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
1b9a0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1b9b0 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1b9c0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1b9d0 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
1b9e0 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
1b9f0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1ba20 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
1ba30 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1ba40 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
1ba50 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1ba60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1ba90 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1bac0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
1bad0 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
1bae0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
1baf0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1bb00 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1bb10 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1bb20 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1bb30 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1bb40 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1bb50 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1bb60 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1bb70 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1bb80 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1bb90 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1bba0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1bbb0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1bbc0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1bbd0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1bbe0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1bbf0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1bc00 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1bc10 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1bc20 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1bc30 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1bc40 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1bc50 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1bc60 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1bc70 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1bc80 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1bc90 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1bca0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1bcb0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1bcc0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1bcd0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1bce0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1bcf0 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1bd00 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1bd10 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1bd20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1bd30 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1bd40 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1bd50 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1bd60 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1bd70 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1bd80 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1bd90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bda0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1bdb0 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1bdc0 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1bdd0 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1bde0 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1bdf0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1be00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1be10 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1be20 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1be30 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1be40 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1be50 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1be60 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1be70 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1be80 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1be90 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1bea0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1beb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1bec0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1bed0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1bee0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1bf00 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1bf10 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1bf20 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1bf30 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
1bf40 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1bf50 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
1bf60 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
1bf70 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
1bf80 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1bf90 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1bfa0 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1bfb0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
1bfc0 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
1bfd0 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
1bfe0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
1bff0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
1c000 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1c010 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1c020 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1c030 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1c040 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
1c050 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1c060 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1c070 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1c080 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1c090 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1c0a0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1c0b0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1c0c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1c0d0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1c0e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c0f0 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
1c100 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1c110 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
1c120 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1c130 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1c140 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1c150 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c170 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
1c180 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1c190 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1c1a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1c1b0 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1c1c0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1c1d0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
1c1e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1c1f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c200 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c210 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
1c220 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1c230 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c250 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
1c260 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
1c270 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
1c280 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
1c290 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
1c2a0 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
1c2b0 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
1c2c0 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
1c2d0 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
1c2e0 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
1c2f0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
1c300 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1c310 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1c320 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1c330 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1c340 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1c350 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
1c360 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1c370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c380 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1c390 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c3a0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
1c3b0 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
1c3c0 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
1c3d0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
1c3e0 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
1c3f0 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
1c400 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
1c410 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
1c420 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
1c430 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c450 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1c460 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1c470 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
1c480 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1c490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1c4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1c4c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1c4d0 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
1c4e0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1c4f0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
1c500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c510 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c520 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1c530 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1c540 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
1c550 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
1c560 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
1c570 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
1c580 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1c590 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1c5a0 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
1c5b0 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
1c5c0 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
1c5d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
1c5e0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
1c5f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1c600 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
1c610 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
1c620 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
1c630 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
1c640 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1c650 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1c660 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1c670 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1c680 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1c690 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1c6a0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1c6b0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1c6c0 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
1c6d0 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1c6e0 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
1c6f0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1c700 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1c710 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1c720 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1c730 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
1c740 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
1c750 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
1c760 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
1c770 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1c780 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
1c790 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1c7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c7b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c7c0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1c7d0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1c7e0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1c7f0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1c800 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1c810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c820 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1c830 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1c840 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1c850 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1c860 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1c870 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1c880 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1c890 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1c8a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c8b0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1c8c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1c8d0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1c8e0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1c8f0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1c900 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1c910 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1c920 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1c930 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1c940 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1c950 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1c960 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1c970 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1c980 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1c990 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1c9a0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1c9b0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1c9c0 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
1c9d0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1c9e0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1c9f0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1ca00 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1ca10 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1ca20 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1ca30 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1ca40 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1ca50 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1ca60 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1ca70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1ca80 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1ca90 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1caa0 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1cab0 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1cac0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1cad0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1cae0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1caf0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1cb00 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1cb10 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1cb20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
1cb30 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1cb40 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1cb50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1cb60 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
1cb70 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1cb90 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
1cba0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1cbb0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbd0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
1cbe0 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
1cbf0 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1cc10 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
1cc20 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
1cc50 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
1cc60 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
1cc70 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc90 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
1cca0 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
1ccb0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1ccc0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
1ccd0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1cce0 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
1ccf0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
1cd00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cd10 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
1cd20 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1cd30 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1cd40 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1cd50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1cd60 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
1cd70 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
1cd80 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1cd90 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1cda0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1cdb0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1cdc0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1cdd0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1cde0 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1cdf0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1ce00 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1ce10 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1ce20 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1ce30 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1ce40 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1ce50 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1ce60 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1ce70 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1ce80 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1ce90 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1cea0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1ceb0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1cec0 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1ced0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1cee0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1cef0 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1cf00 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1cf10 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1cf20 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1cf30 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1cf40 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1cf50 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1cf60 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1cf70 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1cf80 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1cf90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1cfa0 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1cfb0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1cfc0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1cfd0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1cfe0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1cff0 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1d000 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1d010 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1d020 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1d030 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1d040 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d050 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1d060 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d070 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1d080 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1d0b0 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1d0c0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1d0d0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1d0e0 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1d0f0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1d100 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1d110 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1d120 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1d130 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1d140 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1d150 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1d160 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1d170 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1d180 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1d190 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1d1a0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1d1b0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1d1c0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1d1d0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1d1e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1d1f0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1d200 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1d210 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1d220 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1d230 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1d240 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1d250 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1d260 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1d270 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1d280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d290 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d2a0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1d2b0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1d2c0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1d2d0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1d2f0 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1d300 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1d310 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1d320 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1d330 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1d340 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1d350 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1d360 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1d370 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1d380 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1d390 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1d3a0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1d3b0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1d3c0 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1d3d0 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1d3e0 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1d3f0 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1d400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d410 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1d420 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1d430 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1d440 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1d450 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
1d460 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
1d470 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1d480 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
1d490 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c  NDLE hMap = NULL
1d4a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c  ;         /* fil
1d4b0 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
1d4c0 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1d4d0 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
1d4e0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
1d4f0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
1d500 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54  .     .#if SQLIT
1d510 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1d520 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1d530 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1d540 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  pp(pShmNode->hFi
1d550 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1d560 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1d570 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  RITE, nByte, NUL
1d580 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1d590 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d5a0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1d5b0 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1d5c0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1d5d0 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  W(pShmNode->hFil
1d5e0 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
1d5f0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1d600 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1d610 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1d620 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1d630 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1d640 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  I).      hMap = 
1d650 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1d660 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
1d670 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20  File.h, .       
1d680 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1d690 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1d6a0 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1d6b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1d6c0 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
1d6d0 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
1d6e0 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d  region=%d, size=
1d6f0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1d710 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1d720 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
1d730 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1d750 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
1d760 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
1d770 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
1d780 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1d790 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1d7a0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1d7b0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1d7c0 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1d7d0 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1d7e0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1d7f0 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
1d800 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1d810 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1d820 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1d830 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1d840 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1d850 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1d860 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66    iOffset - iOff
1d870 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1d880 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1d890 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  t.        );.#el
1d8a0 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
1d8b0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1d8c0 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
1d8d0 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1d8e0 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1d8f0 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
1d900 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
1d910 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
1d920 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
1d930 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
1d940 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
1d950 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  AP-MAP pid=%lu, 
1d960 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65  region=%d, offse
1d970 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  t=%d, size=%d, r
1d980 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1d990 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d9a0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d9b0 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1d9c0 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
1d9f0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1da00 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1da10 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
1da20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1da30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1da40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1da50 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1da60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1da70 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
1da80 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1da90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1daa0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1dab0 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
1dac0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1dad0 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
1dae0 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
1daf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1db00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1db10 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
1db20 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1db30 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
1db40 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
1db50 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1db60 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1db70 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
1db80 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1db90 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
1dba0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
1dbb0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
1dbc0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
1dbd0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
1dbe0 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
1dbf0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1dc00 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
1dc10 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
1dc20 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1dc30 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1dc40 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
1dc50 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
1dc60 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
1dc70 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
1dc80 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
1dc90 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
1dca0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
1dcb0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1dcc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1dcd0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1dce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1dcf0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
1dd00 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
1dd10 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
1dd20 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
1dd30 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
1dd40 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55  # define winShmU
1dd50 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
1dd60 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
1dd70 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
1dd80 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74  *.** Cleans up t
1dd90 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
1dda0 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
1ddb0 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a  d file, if any..
1ddc0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1ddd0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74  X_MMAP_SIZE>0.st
1dde0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
1ddf0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1de00 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28  File){.  assert(
1de10 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f   pFile!=0 );.  O
1de20 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1de30 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1de40 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1de50 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
1de60 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61  .           "mma
1de70 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70  pSize=%lld, mmap
1de80 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c  SizeActual=%lld,
1de90 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c   mmapSizeMax=%ll
1dea0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1deb0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1dec0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1ded0 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46   pFile->hMap, pF
1dee0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
1def0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1df00 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69  e->mmapSize, pFi
1df10 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1df20 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  al, pFile->mmapS
1df30 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20  izeMax));.  if( 
1df40 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1df50 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  n ){.    if( !os
1df60 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1df70 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1df80 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  n) ){.      pFil
1df90 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1dfa0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1dfb0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1dfc0 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1dfd0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
1dfe0 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e000 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1e010 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75  MMAP\n", osGetCu
1e020 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e030 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  , pFile,.       
1e040 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
1e050 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
1e060 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
1e070 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1e080 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
1e090 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
1e0c0 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
1e0d0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
1e0e0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1e0f0 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1e100 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
1e110 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1e120 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d  eActual = 0;.  }
1e130 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d  .  if( pFile->hM
1e140 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap!=NULL ){.    
1e150 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64  if( !osCloseHand
1e160 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20  le(pFile->hMap) 
1e170 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1e180 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e190 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e1a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e      OSTRACE(("UN
1e1b0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e1c0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70  , pFile=%p, hMap
1e1d0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
1e1e0 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20  OERR_MMAP\n",.  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1e200 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1e210 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
1e220 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20  le->hMap));.    
1e230 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1e240 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e250 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1e260 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1e290 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
1e2a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1e2b0 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
1e2c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1e2d0 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1e2e0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1e2f0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1e300 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1e310 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1e320 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72  (), pFile));.  r
1e330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
1e350 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
1e360 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
1e370 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1e380 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
1e390 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
1e3a0 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
1e3b0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
1e3c0 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
1e3d0 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
1e3e0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
1e3f0 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
1e400 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
1e410 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
1e420 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
1e430 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
1e440 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
1e450 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e460 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1e470 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
1e480 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
1e490 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1e4a0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1e4b0 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
1e4c0 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
1e4d0 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
1e4e0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
1e4f0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
1e500 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
1e510 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
1e520 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1e530 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
1e540 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
1e550 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
1e560 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
1e570 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
1e580 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
1e590 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
1e5a0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1e5b0 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  E, whichever is 
1e5c0 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
1e5d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e5e0 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
1e5f0 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
1e600 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
1e610 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
1e620 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1e630 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1e640 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
1e650 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
1e660 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
1e670 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1e680 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
1e690 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  pFd, sqlite3_int
1e6a0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c  64 nByte){.  sql
1e6b0 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20  ite3_int64 nMap 
1e6c0 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72  = nByte;.  int r
1e6d0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  c;..  assert( nM
1e6e0 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
1e6f0 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
1e700 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1e710 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1e720 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c  e=%p, size=%lld\
1e730 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1e740 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1e750 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79  ssId(), pFd, nBy
1e760 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64  te));..  if( pFd
1e770 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
1e780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e790 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
1e7a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  ){.    rc = winF
1e7b0 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1e7c0 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61  _file*)pFd, &nMa
1e7d0 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  p);.    if( rc )
1e7e0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1e7f0 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1e800 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1e810 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
1e820 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  TAT\n",.        
1e830 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1e840 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e850 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74  pFd));.      ret
1e860 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e870 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
1e880 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
1e890 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
1e8a0 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
1e8b0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1e8c0 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71  }.  nMap &= ~(sq
1e8d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e  lite3_int64)(win
1e8e0 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1e8f0 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28  ze - 1);. .  if(
1e900 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d   nMap==0 && pFd-
1e910 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1e920 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1e930 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pFd);.  }.  if( 
1e940 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
1e950 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ize ){.    void 
1e960 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44  *pNew = 0;.    D
1e970 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50  WORD protect = P
1e980 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
1e990 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
1e9a0 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a  FILE_MAP_READ;..
1e9b0 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1e9c0 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28  (pFd);.    if( (
1e9d0 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
1e9e0 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
1e9f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1ea00 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1ea10 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61  WRITE;.      fla
1ea20 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57  gs |= FILE_MAP_W
1ea30 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RITE;.    }.#if 
1ea40 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1ea50 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1ea60 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1ea70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
1ea80 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1ea90 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
1eaa0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1eab0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1eac0 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
1ead0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1eae0 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
1eaf0 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1eb30 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1eb40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1eb70 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1eb80 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
1eb90 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1eba0 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46  HAS_ANSI).    pF
1ebb0 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1ebc0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1ebd0 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1ebe0 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
1ec10 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
1ec20 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1ec50 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
1ec60 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
1ec70 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
1ec80 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
1ec90 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1eca0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1ecb0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1ecc0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ecd0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1ece0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1ed10 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le1", pFd->zPath
1ed20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1ed30 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1ed40 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1ed50 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1ed60 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1ed70 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1ed80 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
1ed90 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1eda0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1edb0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1edc0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1edd0 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1ede0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1edf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ee00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1ee10 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25   assert( (nMap %
1ee20 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
1ee30 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20  geSize)==0 );.  
1ee40 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1ee50 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
1ee60 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
1ee70 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
1ee80 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  fff );.#if SQLIT
1ee90 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
1eea0 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
1eeb0 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64  fFileFromApp(pFd
1eec0 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
1eed0 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
1eee0 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
1eef0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1ef00 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
1ef10 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
1ef20 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
1ef30 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
1ef40 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
1ef50 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
1ef60 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
1ef70 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1ef80 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
1ef90 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1efa0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
1efb0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1efc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1efd0 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
1efe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eff0 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1f000 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile2", pFd->zPat
1f010 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
1f020 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
1f030 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
1f040 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
1f050 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
1f060 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1f070 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64  MAP-FILE-MAP pid
1f080 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1f090 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1f0a0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f0b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f0c0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1f0d0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1f0e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f0f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1f100 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
1f110 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
1f120 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
1f130 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
1f140 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b  zeActual = nMap;
1f150 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1f160 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1f170 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1f180 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1f190 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1f1a0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1f1b0 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75  ), pFd));.  retu
1f1c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f1d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1f1e0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1f1f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
1f200 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
1f210 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
1f220 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
1f230 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
1f240 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
1f250 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
1f260 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
1f270 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
1f280 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
1f290 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
1f2a0 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
1f2b0 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
1f2c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1f2d0 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
1f2e0 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
1f2f0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
1f300 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
1f310 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1f320 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
1f330 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
1f340 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1f350 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
1f360 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
1f370 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
1f380 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1f390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1f3a0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
1f3b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
1f3c0 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
1f3d0 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
1f3e0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
1f3f0 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
1f400 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  winUnfetch()..*/
1f410 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
1f420 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
1f430 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
1f440 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
1f450 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
1f460 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1f470 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
1f480 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1f490 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1f4a0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
1f4b0 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
1f4c0 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41  pp = 0;..  OSTRA
1f4d0 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
1f4e0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66  lu, pFile=%p, of
1f4f0 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e  fset=%lld, amoun
1f500 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a  t=%d, pp=%p\n",.
1f510 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1f520 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1f530 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41  (), fd, iOff, nA
1f540 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53  mt, pp));..#if S
1f550 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1f560 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d  IZE>0.  if( pFd-
1f570 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29  >mmapSizeMax>0 )
1f580 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70  {.    if( pFd->p
1f590 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a  MapRegion==0 ){.
1f5a0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
1f5b0 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d  inMapfile(pFd, -
1f5c0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
1f5d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f5e0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1f5f0 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
1f600 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
1f610 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f620 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f630 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1f640 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
1f650 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
1f660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1f680 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  ( pFd->mmapSize 
1f690 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a  >= iOff+nAmt ){.
1f6a0 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75        *pp = &((u
1f6b0 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
1f6c0 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  ion)[iOff];.    
1f6d0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
1f6e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ++;.    }.  }.#e
1f6f0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
1f700 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
1f710 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70   pFile=%p, pp=%p
1f720 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c  , *pp=%p, rc=SQL
1f730 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1f740 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f750 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
1f760 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20  d, pp, *pp));.  
1f770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1f790 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
1f7a0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
1f7b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f7c0 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
1f7d0 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
1f7e0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
1f7f0 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63   call to winFetc
1f800 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
1f810 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
1f820 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1f830 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
1f840 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
1f850 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
1f860 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
1f870 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
1f880 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
1f890 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
1f8a0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
1f8b0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
1f8c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f8d0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
1f8e0 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
1f8f0 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
1f900 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
1f910 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
1f920 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
1f930 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
1f940 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
1f950 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
1f960 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
1f970 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1f980 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
1f990 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
1f9a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1f9b0 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
1f9c0 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
1f9d0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
1f9e0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
1f9f0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
1fa00 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
1fa10 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
1fa20 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
1fa30 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
1fa40 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
1fa50 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
1fa60 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
1fa70 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
1fa80 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
1fa90 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
1faa0 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
1fab0 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
1fac0 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
1fad0 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
1fae0 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
1faf0 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
1fb00 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
1fb10 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
1fb20 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
1fb30 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
1fb40 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
1fb50 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ..  OSTRACE(("UN
1fb60 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1fb70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
1fb80 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20  %lld, p=%p\n",. 
1fb90 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1fba0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1fbb0 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29  ), pFd, iOff, p)
1fbc0 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
1fbd0 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
1fbe0 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
1fbf0 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20    /* FIXME:  If 
1fc00 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c  Windows truly al
1fc10 77 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72  ways prevents tr
1fc20 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65  uncating or dele
1fc30 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ting a.    ** fi
1fc40 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69  le while a mappi
1fc50 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e  ng is held, then
1fc60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
1fc70 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61  inUnmapfile() ca
1fc80 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e  ll.    ** is unn
1fc90 65 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e  ecessary can can
1fca0 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f   be omitted - po
1fcb0 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76  tentially improv
1fcc0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f  ing.    ** perfo
1fcd0 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  rmance.  */.    
1fce0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1fcf0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1fd00 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
1fd10 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  >=0 );.#endif.. 
1fd20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
1fd30 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1fd40 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1fd50 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1fd60 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1fd70 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b  ocessId(), fd));
1fd80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fd90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
1fda0 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
1fdb0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
1fdc0 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
1fdd0 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
1fde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fdf0 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
1fe00 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
1fe10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1fe30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1fe80 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
1fe90 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
1fea0 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
1feb0 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
1fec0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
1fed0 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
1fee0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1fef0 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f  io_methods winIo
1ff00 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20  Method = {.  3, 
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff30 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69  iVersion */.  wi
1ff40 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  nClose,         
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff60 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e   xClose */.  win
1ff70 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff90 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72  xRead */.  winWr
1ffa0 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1ffc0 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75  rite */.  winTru
1ffd0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1ffe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1fff0 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53  uncate */.  winS
20000 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
20010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20020 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Sync */.  winFil
20030 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
20040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
20050 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c  leSize */.  winL
20060 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20080 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c  Lock */.  winUnl
20090 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
200a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
200b0 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65  lock */.  winChe
200c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
200d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
200e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
200f0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74  */.  winFileCont
20100 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
20110 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
20120 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63  trol */.  winSec
20130 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
20140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
20150 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69  ctorSize */.  wi
20160 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
20170 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a  istics,       /*
20180 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
20190 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e  ristics */.  win
201a0 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201c0 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e  xShmMap */.  win
201d0 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201f0 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
20200 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20220 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
20230 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20    winShmUnmap,  
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
20260 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20  /.  winFetch,   
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
20290 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20  .  winUnfetch   
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
202c0 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
202d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
202f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20310 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
20320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20330 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
20340 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
20350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20360 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
20370 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
20380 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
20390 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
203a0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
203b0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23  fs object..*/..#
203c0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
203d0 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e  WIN__)./*.** Con
203e0 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20  vert a filename 
203f0 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68  from whatever th
20400 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
20410 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a  rating system.**
20420 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69   supports for fi
20430 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46  lenames into UTF
20440 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
20450 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ld the result is
20460 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
20470 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
20480 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
20490 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
204a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
204b0 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f  ar *winConvertTo
204c0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
204d0 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
204e0 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  me){.  char *zCo
204f0 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
20500 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
20510 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20520 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
20530 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
20540 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
20550 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
20560 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
20570 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77  rted = sqlite3_w
20580 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
20590 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  8(zFilename);.  
205a0 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
205b0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
205c0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
205d0 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
205e0 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a  erted;.}.#endif.
205f0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
20600 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20   UTF-8 filename 
20610 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
20620 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rm the underlyin
20630 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  g.** operating s
20640 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65  ystem wants file
20650 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65  names in.  Space
20660 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
20670 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ult.** is obtain
20680 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
20690 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
206a0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
206b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
206c0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
206d0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
206e0 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
206f0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
20700 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
20710 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
20720 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
20730 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74  onverted = winUt
20740 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
20750 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
20760 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
20770 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
20780 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
20790 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
207a0 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69  utf8_to_mbcs(zFi
207b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  lename);.  }.#en
207c0 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
207d0 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
207e0 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
207f0 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
20800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20810 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
20820 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
20830 20 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38   specified UTF-8
20840 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a   string buffer.*
20850 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69  * ends with a di
20860 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
20870 72 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f  r character or o
20880 6e 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ne was successfu
20890 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  lly.** added to 
208a0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
208b0 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69  t winMakeEndInDi
208c0 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63  rSep(int nBuf, c
208d0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66  har *zBuf){.  if
208e0 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e  ( zBuf ){.    in
208f0 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33  t nLen = sqlite3
20900 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
20910 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29      if( nLen>0 )
20920 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  {.      if( winI
20930 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65  sDirSep(zBuf[nLe
20940 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n-1]) ){.       
20950 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
20960 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b   }else if( nLen+
20970 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  1<nBuf ){.      
20980 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77    zBuf[nLen] = w
20990 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20  inGetDirSep();. 
209a0 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
209b0 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
209c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
209d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
209e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
209f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
20a00 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
20a10 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
20a20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65  resulting pointe
20a30 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a  r into pzBuf..**
20a40 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
20a50 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d  urned in pzBuf m
20a60 75 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61  ust be freed via
20a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
20a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20a90 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  inGetTempname(sq
20aa0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20ab0 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a   char **pzBuf){.
20ac0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
20ad0 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
20ae0 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
20af0 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
20b00 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
20b10 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
20b20 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
20b30 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e  ize_t i, j;.  in
20b40 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33  t nPre = sqlite3
20b50 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f  Strlen30(SQLITE_
20b60 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
20b70 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e  );.  int nMax, n
20b80 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b  Buf, nDir, nLen;
20b90 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
20ba0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
20bb0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
20bc0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
20bd0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
20be0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
20bf0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
20c00 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
20c10 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
20c20 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
20c30 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
20c40 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
20c50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
20c60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
20c70 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20c80 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  e a temporary bu
20c90 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
20ca0 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
20cb0 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  d file.  ** name
20cc0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
20cd0 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69  ry file.  If thi
20ce0 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e  s fails, we cann
20cf0 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a  ot continue..  *
20d00 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d  /.  nMax = pVfs-
20d10 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75  >mxPathname; nBu
20d20 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20  f = nMax + 2;.  
20d30 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61  zBuf = sqlite3Ma
20d40 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29  llocZero( nBuf )
20d50 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b  ;.  if( !zBuf ){
20d60 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
20d70 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
20d80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
20d90 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  EM\n"));.    ret
20da0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
20db0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
20dc0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
20dd0 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f   effective tempo
20de0 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
20df0 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66   First, check if
20e00 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65   one.  ** has be
20e10 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65  en explicitly se
20e20 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61  t by the applica
20e30 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c  tion; otherwise,
20e40 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a   use the one.  *
20e50 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
20e60 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
20e70 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69  stem..  */.  nDi
20e80 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65  r = nMax - (nPre
20e90 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74   + 15);.  assert
20ea0 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66  ( nDir>0 );.  if
20eb0 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
20ec0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
20ed0 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71  int nDirLen = sq
20ee0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
20ef0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
20f00 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e  tory);.    if( n
20f10 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  DirLen>0 ){.    
20f20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53    if( !winIsDirS
20f30 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ep(sqlite3_temp_
20f40 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65  directory[nDirLe
20f50 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n-1]) ){.       
20f60 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20   nDirLen++;.    
20f70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44    }.      if( nD
20f80 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20  irLen>nDir ){.  
20f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20fa0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
20fb0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
20fc0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
20fd0 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
20fe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
20ff0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
21000 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e  E_ERROR, 0, "win
21010 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30  GetTempname1", 0
21020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21030 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
21040 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
21050 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  s", sqlite3_temp
21060 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
21070 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e   }.  }.#if defin
21080 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
21090 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69   else{.    stati
210a0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
210b0 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
210c0 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
210d0 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20  SQLITE_TMPDIR") 
210e0 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
210f0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
21100 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
21110 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a   getenv("TMP") *
21120 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
21130 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f  etenv("TEMP") */
21140 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21150 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c  tenv("USERPROFIL
21160 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f  E") */.       "/
21170 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20  var/tmp",.      
21180 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
21190 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
211a0 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30     ".",.       0
211b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
211c0 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
211d0 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65    };.    unsigne
211e0 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e  d int i;.    con
211f0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
21200 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44  0;..    if( !azD
21210 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b  irs[0] ) azDirs[
21220 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  0] = getenv("SQL
21230 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
21240 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
21250 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
21260 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
21270 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
21280 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20  [2] ) azDirs[2] 
21290 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b  = getenv("TMP");
212a0 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
212b0 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20  [3] ) azDirs[3] 
212c0 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29  = getenv("TEMP")
212d0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
212e0 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d  s[4] ) azDirs[4]
212f0 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50   = getenv("USERP
21300 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f  ROFILE");.    fo
21310 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
21320 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
21330 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d  zDirs[0]); zDir=
21340 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20  azDirs[i++]){.  
21350 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65      void *zConve
21360 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20  rted;.      if( 
21370 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
21380 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ue;.      /* If 
21390 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20  the path starts 
213a0 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74  with a drive let
213b0 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ter followed by 
213c0 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20  the colon.      
213d0 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73  ** character, as
213e0 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61  sume it is alrea
213f0 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  dy a native Win3
21400 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73  2 path; otherwis
21410 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  e,.      ** it m
21420 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ust be converted
21430 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e   to a native Win
21440 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20  32 path via the 
21450 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20  Cygwin API.     
21460 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69   ** prior to usi
21470 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ng it..      */.
21480 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
21490 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
214a0 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20  on(zDir) ){.    
214b0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
214c0 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
214d0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72  tf8Filename(zDir
214e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
214f0 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
21500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21510 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
21520 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21530 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
21540 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
21550 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
21560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21570 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
21580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21590 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
215a0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
215b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
215c0 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
215d0 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b  uf, "%s", zDir);
215e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
215f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
21600 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
21610 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
21620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21630 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21640 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21650 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
21660 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  d = sqlite3Mallo
21670 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b  cZero( nMax+1 );
21680 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
21690 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
216a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
216b0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
216c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
216d0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
216e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
216f0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
21700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21710 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
21720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21730 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
21740 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
21750 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20       osIsNT() ? 
21760 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
21770 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
21780 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20  O_WIN_A, zDir,. 
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
217a0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b  Converted, nMax+
217b0 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1)<0 ){.        
217c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
217d0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
217e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
217f0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21800 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21810 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21820 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
21830 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
21840 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
21850 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
21860 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OERR_CONVPATH, (
21870 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
218a0 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69  tTempname2", zDi
218b0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
218c0 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
218d0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
218e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
218f0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
21900 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64   know the candid
21910 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78  ate directory ex
21920 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a  ists and should.
21930 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
21940 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  used.  However, 
21950 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63  we may need to c
21960 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e  onvert the strin
21970 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  g containing.   
21980 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61         ** its na
21990 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69  me into UTF-8 (i
219a0 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46  .e. if it is UTF
219b0 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a  -16 right now)..
219c0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
219d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74         char *zUt
219e0 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
219f0 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43  oUtf8Filename(zC
21a00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21a10 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
21a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
21a30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21a40 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21a50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21a60 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
21a70 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
21a80 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
21a90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21aa0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
21ab0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21ac0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
21ad0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
21af0 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
21b00 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
21b10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21b20 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
21b30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21b40 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
21b50 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
21b60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
21b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21b80 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
21b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21ba0 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45   }.#elif !SQLITE
21bb0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
21bc0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
21bd0 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49  ).  else if( osI
21be0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
21bf0 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c  r *zMulti;.    L
21c00 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20  PWSTR zWidePath 
21c10 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
21c20 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66  ero( nMax*sizeof
21c30 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69  (WCHAR) );.    i
21c40 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b  f( !zWidePath ){
21c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21c60 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
21c70 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21c80 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21c90 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
21ca0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
21cb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21cc0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
21cd0 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
21ce0 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61  hW(nMax, zWidePa
21cf0 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
21d00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
21d10 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73  dePath);.      s
21d20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21d30 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21d40 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
21d50 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
21d60 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
21d70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21d80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21d90 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
21da0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
21db0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
21de0 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  2", 0);.    }.  
21df0 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e    zMulti = winUn
21e00 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
21e10 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
21e20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
21e30 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21e40 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
21e50 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
21e60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21e70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
21e80 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
21e90 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Path);.    }else
21ea0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
21eb0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
21ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21ed0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
21ee0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21ef0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21f00 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
21f10 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
21f20 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21f30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
21f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
21f50 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
21f60 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
21f70 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a  Utf8;.    char *
21f80 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69  zMbcsPath = sqli
21f90 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
21fa0 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21  Max );.    if( !
21fb0 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20  zMbcsPath ){.   
21fc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21fd0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
21fe0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
21ff0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
22000 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
22010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22020 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22040 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e  osGetTempPathA(n
22050 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d  Max, zMbcsPath)=
22060 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
22070 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22080 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22090 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
220a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
220b0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
220c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
220d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
220e0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
220f0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
22100 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
22120 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c  inGetTempname3",
22130 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
22140 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77  Utf8 = sqlite3_w
22150 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
22160 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  8(zMbcsPath);.  
22170 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20    if( zUtf8 ){. 
22180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22190 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
221a0 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
221b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
221c0 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d  ee(zUtf8);.    }
221d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
221e0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
221f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22200 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22210 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
22220 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
22230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22240 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
22250 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
22260 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
22270 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ANSI */.#endif /
22280 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  * !SQLITE_OS_WIN
22290 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  RT */..  /*.  **
222a0 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
222b0 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ure the temporar
222c0 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73  y directory ends
222d0 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72   with an appropr
222e0 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61  iate.  ** separa
222f0 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73  tor.  If it does
22300 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69   not and there i
22310 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61  s not enough spa
22320 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20  ce left to add. 
22330 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20   ** one, fail.. 
22340 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61   */.  if( !winMa
22350 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44  keEndInDirSep(nD
22360 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20  ir+1, zBuf) ){. 
22370 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22380 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41  zBuf);.    OSTRA
22390 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
223a0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
223b0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
223c0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
223d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
223e0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
223f0 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  4", 0);.  }..  /
22400 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61  *.  ** Check tha
22410 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
22420 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
22430 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
22440 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
22450 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c   name in the fol
22460 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20  lowing format:. 
22470 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d   **.  **   "<tem
22480 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
22490 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58  >/etilqs_XXXXXXX
224a0 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20  XXXXXXXX\0\0".  
224b0 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  **.  ** If not, 
224c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
224d0 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ROR.  The number
224e0 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65   17 is used here
224f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
22500 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  * account for th
22510 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
22520 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72  the 15 character
22530 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61   random suffix a
22540 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  nd the.  ** two 
22550 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61  trailing NUL cha
22560 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69  racters.  The fi
22570 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65  nal directory se
22580 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
22590 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  r.  ** has alrea
225a0 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77  dy added if it w
225b0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  as not already p
225c0 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  resent..  */.  n
225d0 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
225e0 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69  len30(zBuf);.  i
225f0 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20  f( (nLen + nPre 
22600 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a  + 17) > nBuf ){.
22610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22620 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
22630 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22640 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
22650 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
22660 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
22670 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
22680 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
22690 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e5", 0);.  }..  
226a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
226b0 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a  (nBuf-16-nLen, z
226c0 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45  Buf+nLen, SQLITE
226d0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
226e0 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74  X);..  j = sqlit
226f0 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
22700 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
22710 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
22720 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [j]);.  for(i=0;
22730 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
22740 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  {.    zBuf[j] = 
22750 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
22760 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
22770 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
22780 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d  Chars)-1) ];.  }
22790 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a  .  zBuf[j] = 0;.
227a0 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
227b0 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66  .  *pzBuf = zBuf
227c0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
227d0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d  EMP-FILENAME nam
227e0 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
227f0 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  OK\n", zBuf));. 
22800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22810 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
22820 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
22830 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61  amed file is rea
22840 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e  lly a directory.
22850 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
22860 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  f.** it is somet
22870 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
22880 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20  a directory, or 
22890 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
228a0 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  kind of memory.*
228b0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
228c0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
228d0 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
228e0 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  st void *zConver
228f0 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  ted){.  DWORD at
22900 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
22910 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
22920 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73  rno;..  if( osIs
22930 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
22940 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
22950 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
22960 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
22970 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
22980 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
22990 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
229a0 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
229b0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
229c0 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
229d0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
22a00 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
22a10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22a30 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
22a40 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
22a50 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
22a60 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29  {}.    if( !rc )
22a70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
22a80 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d  ; /* Invalid nam
22a90 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  e? */.    }.    
22aa0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
22ab0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
22ac0 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  s;.#if SQLITE_OS
22ad0 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
22ae0 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
22af0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
22b00 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
22b10 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
22b20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72  }.  return (attr
22b30 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
22b40 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61  TTRIBUTES) && (a
22b50 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
22b60 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d  TE_DIRECTORY);.}
22b70 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
22b80 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
22b90 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
22ba0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
22bb0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22bc0 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70  to get maximum p
22bd0 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20  ath name length 
22be0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22bf0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
22c00 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
22c10 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
22c20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
22c30 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
22c40 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
22c50 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
22c60 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c80 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
22c90 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
22ca0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
22cb0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
22cc0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
22cd0 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
22ce0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
22cf0 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
22d00 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
22d10 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
22d20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
22d30 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
22d40 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
22d50 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
22d60 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
22d70 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
22d80 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
22d90 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
22da0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
22db0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22dd0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
22de0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
22df0 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
22e00 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
22e10 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
22e20 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
22e30 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
22e40 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
22e50 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
22e60 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
22e70 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
22e80 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
22e90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
22ea0 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
22eb0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
22ec0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
22ed0 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d  .  char *zTmpnam
22ee0 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65  e = 0; /* For te
22ef0 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
22f00 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  , if necessary. 
22f10 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
22f20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
22f30 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
22f40 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
22f50 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
22f60 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
22f70 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
22f80 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
22f90 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
22fa0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
22fb0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
22fc0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
22fd0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
22fe0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
22ff0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
23000 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
23010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23020 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
23030 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
23040 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23050 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
23060 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
23070 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23080 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
23090 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
230a0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
230b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
230c0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
230d0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
230e0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
230f0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
23100 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
23110 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
23120 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
23130 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23140 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
23150 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
23160 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
23170 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
23180 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
23190 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d   name=%s, pFile=
231a0 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f  %p, flags=%x, pO
231b0 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20  utFlags=%p\n",. 
231c0 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e            zUtf8N
231d0 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20  ame, id, flags, 
231e0 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20  pOutFlags));..  
231f0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
23200 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
23210 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
23220 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
23230 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
23240 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
23250 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
23260 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
23270 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
23280 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
23290 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
232a0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
232b0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
232c0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
232d0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
232e0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
232f0 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
23300 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
23310 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
23320 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
23330 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
23340 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
23350 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
23360 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
23370 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
23380 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
23390 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
233a0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
233b0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
233c0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
233d0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
233e0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
233f0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
23400 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
23410 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
23420 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
23430 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
23440 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
23450 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
23460 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
23470 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
23480 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
23490 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
234a0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
234b0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
234c0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
234d0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
234e0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
234f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
23500 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
23510 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
23520 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
23530 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
23540 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
23550 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
23560 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
23570 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
23580 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
23590 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
235a0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
235b0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
235c0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
235d0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
235e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
235f0 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
23600 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
23610 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
23620 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23630 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
23640 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
23650 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
23660 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
23670 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23680 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
23690 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
236a0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
236b0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
236c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
236d0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
236e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
236f0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
23700 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
23710 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  =0 );.  memset(p
23720 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
23730 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  winFile));.  pFi
23740 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
23750 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23  HANDLE_VALUE;..#
23760 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23770 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  RT.  if( !zUtf8N
23780 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f  ame && !sqlite3_
23790 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
237a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
237b0 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
237c0 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
237d0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
237e0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
237f0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
23800 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
23810 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f    /* If the seco
23820 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
23830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23840 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61  NULL, generate a
23850 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
23860 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73   file name to us
23870 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a  e .  */.  if( !z
23880 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20  Utf8Name ){.    
23890 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65  assert( isDelete
238a0 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e   && !isOpenJourn
238b0 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  al );.    rc = w
238c0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  inGetTempname(pV
238d0 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a  fs, &zTmpname);.
238e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
238f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f  TE_OK ){.      O
23900 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
23910 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a  me=%s, rc=%s", z
23920 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65  Utf8Name, sqlite
23930 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
23940 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23950 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
23960 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
23970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62  .  }..  /* Datab
23980 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
23990 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
239a0 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
239b0 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52   are not.  ** UR
239c0 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
239d0 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
239e0 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
239f0 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
23a00 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
23a10 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  meter()..  */.  
23a20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d  assert( (eType!=
23a30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
23a40 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26  _DB) || (flags &
23a50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
23a60 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66  ) ||.       zUtf
23a70 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  8Name[sqlite3Str
23a80 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29  len30(zUtf8Name)
23a90 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  +1]==0 );..  /* 
23aa0 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
23ab0 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
23ac0 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
23ad0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
23ae0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
23af0 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
23b00 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
23b10 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
23b20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
23b30 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
23b40 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
23b50 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
23b60 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74  OERR_NOMEM", zUt
23b70 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
23b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
23b90 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
23ba0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
23bb0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
23bc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
23bd0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
23be0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
23bf0 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
23c00 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
23c10 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54  , rc=SQLITE_CANT
23c20 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74  OPEN_ISDIR", zUt
23c30 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
23c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
23c50 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a  OPEN_ISDIR;.  }.
23c60 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
23c70 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
23c80 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
23c90 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
23ca0 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
23cb0 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
23cc0 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
23cd0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
23ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23cf0 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
23d00 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
23d10 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a   a new file is .
23d20 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
23d30 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
23d40 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
23d50 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
23d60 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  s" .  ** as it i
23d70 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
23d80 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tood..  */.  if(
23d90 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a   isExclusive ){.
23da0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
23db0 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
23dc0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
23dd0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
23de0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
23df0 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
23e00 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
23e10 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
23e20 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
23e30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43  .  }else if( isC
23e40 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  reate ){.    /* 
23e50 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
23e60 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
23e70 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
23e80 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
23e90 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
23ea0 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
23eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
23ec0 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
23ed0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
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 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
23f10 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20  ..  dwShareMode 
23f20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  = FILE_SHARE_REA
23f30 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
23f40 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44  RITE;..  if( isD
23f50 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c  elete ){.#if SQL
23f60 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
23f70 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
23f80 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
23f90 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20  RIBUTE_HIDDEN;. 
23fa0 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23     isTemp = 1;.#
23fb0 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73  else.    dwFlags
23fc0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
23fd0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
23fe0 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20  EMPORARY.       
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41          | FILE_A
24010 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a  TTRIBUTE_HIDDEN.
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
24040 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
24050 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64  E_ON_CLOSE;.#end
24060 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
24070 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24080 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
24090 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  IBUTE_NORMAL;.  
240a0 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66  }.  /* Reports f
240b0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74  rom the internet
240c0 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72   are that perfor
240d0 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a  mance is always.
240e0 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46    ** better if F
240f0 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
24100 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20  ACCESS is used. 
24110 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a   Ticket #2699. *
24120 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
24130 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41  WINCE.  dwFlagsA
24140 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20  ndAttributes |= 
24150 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
24160 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a  _ACCESS;.#endif.
24170 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
24180 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
24190 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54  _WINRT.    CREAT
241a0 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
241b0 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e  PARAMETERS exten
241c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20  dedParameters;. 
241d0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
241e0 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73  eters.dwSize = s
241f0 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45  izeof(CREATEFILE
24200 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
24210 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65  ETERS);.    exte
24220 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
24230 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20  wFileAttributes 
24240 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77  =.            dw
24250 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24260 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  es & FILE_ATTRIB
24270 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  UTE_MASK;.    ex
24280 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
24290 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64  .dwFileFlags = d
242a0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
242b0 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f  tes & FILE_FLAG_
242c0 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
242d0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
242e0 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20  ecurityQosFlags 
242f0 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59  = SECURITY_ANONY
24300 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64  MOUS;.    extend
24310 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53  edParameters.lpS
24320 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65  ecurityAttribute
24330 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78  s = NULL;.    ex
24340 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
24350 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d  .hTemplateFile =
24360 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65   NULL;.    while
24370 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
24380 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43  ile2((LPCWSTR)zC
24390 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243b0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
243c0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
243f0 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24410 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
24420 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64         &extended
24450 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e  Parameters))==IN
24460 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24470 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
244a0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
244b0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
244c0 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
244d0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
244e0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
244f0 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57  reateFileW((LPCW
24500 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24530 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
24560 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
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 20 20 20 64 77                dw
24590 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
245a0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
245d0 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
24600 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
24610 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
24640 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
24650 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
24660 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
24670 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  /.    }.#endif. 
24680 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
24690 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
246a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c    else{.    whil
246b0 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
246c0 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43  FileA((LPCSTR)zC
246d0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
24700 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
24730 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
24760 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
24790 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
247a0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
247d0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
247e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
24800 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
24810 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
24820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24830 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
24840 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  }.  }.#endif.  w
24850 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
24860 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
24870 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
24880 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
24890 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55   rc=%s\n", h, zU
248a0 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  tf8Name,.       
248b0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
248c0 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44  ess, (h==INVALID
248d0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f  _HANDLE_VALUE) ?
248e0 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
248f0 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
24900 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24910 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
24920 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
24930 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
24940 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
24950 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e  ANTOPEN, pFile->
24960 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f  lastErrno, "winO
24970 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pen", zUtf8Name)
24980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
24990 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
249a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
249b0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
249c0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
249d0 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
249e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
249f0 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
24a00 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
24a10 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
24a20 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
24a30 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   &.             
24a40 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45          ~(SQLITE
24a50 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
24a60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
24a70 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70  TE)),.         p
24a80 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
24a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
24aa0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24ab0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
24ac0 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
24ad0 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
24ae0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
24af0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
24b00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
24b10 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
24b20 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
24b30 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
24b40 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
24b50 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  }.  }..  OSTRACE
24b60 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
24b70 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
24b80 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  =%lx, pOutFlags=
24b90 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25  %p, *pOutFlags=%
24ba0 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
24bb0 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55  "rc=%s\n", h, zU
24bc0 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  tf8Name, dwDesir
24bd0 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c  edAccess, pOutFl
24be0 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f  ags, pOutFlags ?
24bf0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75  .           *pOu
24c00 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d  tFlags : 0, (h==
24c10 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
24c20 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
24c30 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20   : "ok"));..#if 
24c40 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
24c50 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
24c60 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
24c70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
24c80 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
24c90 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
24ca0 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d  zName, pFile))!=
24cb0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20  SQLITE_OK.  ){. 
24cc0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
24cd0 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
24ce0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24cf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24d00 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
24d10 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
24d20 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25  N-CE-LOCK name=%
24d30 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61  s, rc=%s\n", zNa
24d40 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
24d50 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65  me(rc)));.    re
24d60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
24d70 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
24d80 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
24d90 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
24da0 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
24db0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
24dc0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24dd0 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ted);.  }..  sql
24de0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
24df0 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  me);.  pFile->pM
24e00 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65  ethod = &winIoMe
24e10 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  thod;.  pFile->p
24e20 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46  Vfs = pVfs;.  pF
24e30 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66  ile->h = h;.  if
24e40 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ( isReadonly ){.
24e50 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
24e60 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
24e70 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  RDONLY;.  }.  if
24e80 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
24e90 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73  olean(zName, "ps
24ea0 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
24eb0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
24ec0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
24ed0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
24ee0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
24ef0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
24f00 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70   = NO_ERROR;.  p
24f10 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
24f20 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ame;.#if SQLITE_
24f30 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
24f40 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20    pFile->hMap = 
24f50 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  NULL;.  pFile->p
24f60 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
24f70 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
24f80 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
24f90 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
24fa0 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
24fb0 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
24fc0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
24fd0 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Mmap;.#endif..  
24fe0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
24ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25000 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
25010 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
25020 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69  .** Note that Wi
25030 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
25040 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
25050 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
25060 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
25070 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
25080 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
25090 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
250a0 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
250b0 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
250c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
250d0 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
250e0 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
250f0 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
25100 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
25110 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
25120 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
25130 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
25140 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
25150 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
25160 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
25170 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
25180 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
25190 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
251a0 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
251b0 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
251c0 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
251d0 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
251e0 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
251f0 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
25200 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
25210 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
25220 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
25230 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
25240 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
25250 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
25260 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
25270 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
25280 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
25290 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
252a0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
252b0 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
252c0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
252d0 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
252e0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
252f0 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61  nt rc;.  DWORD a
25300 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ttr;.  DWORD las
25310 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
25320 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
25330 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25340 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53  ER(pVfs);.  UNUS
25350 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e  ED_PARAMETER(syn
25360 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  cDir);..  Simula
25370 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
25380 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
25390 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  LETE);.  OSTRACE
253a0 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
253b0 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22  s, syncDir=%d\n"
253c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e  , zFilename, syn
253d0 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  cDir));..  zConv
253e0 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
253f0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
25400 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
25410 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
25420 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
25430 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
25440 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
25450 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
25460 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
25470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25480 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
25490 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
254a0 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
254b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
254c0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
254d0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
254e0 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
254f0 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
25500 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
25510 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
25520 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
25530 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
25540 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
25550 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25580 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
25590 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
255a0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
255b0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
255c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
255d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
255e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
255f0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
25600 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
25610 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
25620 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
25630 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
25640 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
25650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
25660 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
25670 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
25680 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
25690 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
256a0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
256b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
256c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
256d0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
256e0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
256f0 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
25700 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
25710 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
25720 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
25730 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
25740 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
25750 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
25760 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
25770 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
25780 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
25790 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
257a0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
257b0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
257c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
257d0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
257e0 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
257f0 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
25800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25820 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
25830 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
25840 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
25850 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
25860 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
25870 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25880 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
25890 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
258a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
258b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
258c0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
258d0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
258e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
258f0 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
25900 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
25910 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25920 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
25930 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
25940 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
25950 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25960 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
25970 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
25980 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25990 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
259a0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
259b0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
259c0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
259d0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
259e0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
259f0 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
25a00 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
25a10 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
25a20 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
25a30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
25a40 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
25a50 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
25a60 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
25a70 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
25a80 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
25a90 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
25aa0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
25ab0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
25ac0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25ad0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
25ae0 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
25af0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
25b00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25b10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25b30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25b40 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
25b50 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
25b60 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
25b70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25b80 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
25b90 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
25ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25bb0 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
25bc0 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
25bd0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
25be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25bf0 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
25c00 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
25c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25c20 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
25c30 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
25c40 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
25c50 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
25c60 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
25c70 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
25c80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25c90 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
25ca0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
25cb0 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
25cc0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
25cd0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
25ce0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
25cf0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
25d00 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  E, lastErrno, "w
25d10 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
25d20 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
25d30 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
25d40 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  cnt);.  }.  sqli
25d50 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
25d60 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
25d70 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
25d80 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c  , rc=%s\n", zFil
25d90 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  ename, sqlite3Er
25da0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
25db0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25dc0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
25dd0 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stence and statu
25de0 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
25df0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
25e00 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
25e10 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
25e20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
25e30 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
25e40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
25e50 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
25e60 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
25e70 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e90 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
25ea0 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
25eb0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
25ec0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
25ed0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
25ee0 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
25ef0 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
25f00 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
25f10 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
25f20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
25f30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
25f40 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53  ETER(pVfs);..  S
25f50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
25f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25f70 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
25f80 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
25f90 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73  S name=%s, flags
25fa0 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%x, pResOut=%p\
25fb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
25fc0 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c  Filename, flags,
25fd0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a   pResOut));..  z
25fe0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
25ff0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
26000 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
26010 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
26020 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
26030 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
26040 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
26050 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
26060 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
26070 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26080 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
26090 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
260a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
260b0 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
260c0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
260d0 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
260e0 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
260f0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
26100 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
26110 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
26120 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
26130 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
26140 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
26170 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20  InfoStandard, . 
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
261a0 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
261b0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
261c0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
261d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
261e0 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51      /* For an SQ
261f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
26200 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20  TS query, treat 
26210 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69  a zero-length fi
26220 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  le.      ** as i
26230 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
26240 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
26250 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73      if(    flags
26260 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
26270 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20  EXISTS.         
26280 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
26290 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a  ileSizeHigh==0 .
262a0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
262b0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
262c0 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Low==0 ){.      
262d0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
262e0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
262f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26300 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
26310 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
26320 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
26330 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
26340 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
26350 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  nt);.      if( l
26360 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
26370 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26  FILE_NOT_FOUND &
26380 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  & lastErrno!=ERR
26390 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
263a0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
263b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
263c0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72  rted);.        r
263d0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
263e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  r(SQLITE_IOERR_A
263f0 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f  CCESS, lastErrno
26400 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20  , "winAccess",. 
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
26430 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
26440 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
26450 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
26460 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
26470 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
26480 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
26490 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
264a0 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
264b0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
264c0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
264d0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
264e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
264f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
26500 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
26510 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
26520 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
26530 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
26540 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
26550 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
26560 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26570 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61  UTES;.      brea
26580 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
26590 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
265a0 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  ITE:.      rc = 
265b0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
265c0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
265d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61  .             (a
265e0 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
265f0 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  BUTE_READONLY)==
26600 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
26610 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
26620 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
26630 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
26640 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
26650 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54  sOut = rc;.  OST
26660 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
26670 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25  me=%s, pResOut=%
26680 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
26690 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
266a0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
266b0 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20  ename, pResOut, 
266c0 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
266d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
266e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
266f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
26700 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
26710 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
26720 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a   a drive letter.
26730 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
26740 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72   colon character
26750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
26760 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
26770 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e  rAndColon(.  con
26780 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
26790 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  me.){.  return (
267a0 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28   sqlite3Isalpha(
267b0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26  zPathname[0]) &&
267c0 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27   zPathname[1]=='
267d0 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  :' );.}../*.** R
267e0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
267f0 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
26800 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
26810 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74  d be used verbat
26820 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a  im.  If.** non-z
26830 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
26840 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
26850 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  on, the calling 
26860 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69  function must si
26870 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20  mply.** use the 
26880 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61  provided path na
26890 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d  me verbatim -OR-
268a0 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f   resolve it into
268b0 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d   a full path nam
268c0 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47  e.** using the G
268d0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57  etFullPathName W
268e0 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f  in32 API functio
268f0 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  n (if available)
26900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
26910 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61   winIsVerbatimPa
26920 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20  thname(.  const 
26930 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
26940 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  ){.  /*.  ** If 
26950 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
26960 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77  arts with a forw
26970 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62  ard slash or a b
26980 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20  ackslash, it is 
26990 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65  either.  ** a le
269a0 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20  gal UNC name, a 
269b0 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20  volume relative 
269c0 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f  path, or an abso
269d0 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69  lute path name i
269e0 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78  n the.  ** "Unix
269f0 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64  " format on Wind
26a00 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ows.  There is n
26a10 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69  o easy way to di
26a20 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77  fferentiate betw
26a30 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  een.  ** the fin
26a40 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68  al two cases; th
26a50 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75  erefore, we retu
26a60 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74  rn the safer ret
26a70 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55  urn value of TRU
26a80 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63  E.  ** so that c
26a90 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
26aa0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d  unction will sim
26ab0 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61  ply use it verba
26ac0 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  tim..  */.  if (
26ad0 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61   winIsDirSep(zPa
26ae0 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  thname[0]) ){.  
26af0 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
26b00 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
26b10 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
26b20 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74  tarts with a let
26b30 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20  ter and a colon 
26b40 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76  it is either a v
26b50 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74  olume.  ** relat
26b60 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61  ive path or an a
26b70 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43  bsolute path.  C
26b80 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
26b90 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  unction must not
26ba0 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  .  ** attempt to
26bb0 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72   treat it as a r
26bc0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
26bd0 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f  e (i.e. they sho
26be0 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20  uld simply use. 
26bf0 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29   ** it verbatim)
26c00 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69  ..  */.  if ( wi
26c10 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
26c20 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65  dColon(zPathname
26c30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26c40 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
26c50 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74    ** If we get t
26c60 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
26c70 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  e path name shou
26c80 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ld almost certai
26c90 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a  nly be a purely.
26ca0 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e    ** relative on
26cb0 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e  e (i.e. not a UN
26cc0 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f  C name, not abso
26cd0 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f  lute, and not vo
26ce0 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a  lume relative)..
26cf0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41    */.  return FA
26d00 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75  LSE;.}../*.** Tu
26d10 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
26d20 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
26d30 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
26d40 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
26d50 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f  pathname into zO
26d60 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69  ut[].  zOut[] wi
26d70 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70  ll be at least p
26d80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
26d90 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
26da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26db0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
26dc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26dd0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
26de0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
26df0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
26e00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
26e10 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tive,        /* 
26e20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
26e30 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
26e40 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20    int nFull,    
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
26e70 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
26e80 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75  s */.  char *zFu
26e90 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
26ea0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
26eb0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23  uffer */.){.  .#
26ec0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
26ed0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
26ee0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
26ef0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
26f00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26f10 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
26f20 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
26f30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
26f40 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
26f50 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
26f60 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
26f70 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
26f80 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
26f90 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
26fa0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
26fb0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
26fc0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
26fd0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
26fe0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
26ff0 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
27000 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
27010 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
27020 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
27030 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
27040 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
27050 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
27060 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
27070 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
27080 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
27090 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
270a0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
270b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
270c0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
270d0 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
270e0 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
270f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27100 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
27110 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
27120 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
27130 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
27140 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
27150 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
27160 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
27170 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
27180 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
27190 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
271a0 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
271b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
271c0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
271d0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
271e0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
271f0 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
27200 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
27230 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
27240 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
27250 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
27260 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
27270 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
27280 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
27290 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
272a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
272b0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
272c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
272d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
272e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
272f0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27300 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27310 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
27320 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
27330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27340 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
27350 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
27360 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
27370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27380 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
27390 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
273a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
273b0 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
273c0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
273d0 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
273e0 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
273f0 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
27400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27410 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
27420 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
27430 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
27440 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
27450 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
27460 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
27470 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
27480 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
27490 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
274a0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
274b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
274c0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
274d0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
274e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
274f0 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
27500 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
27530 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
27540 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
27550 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
27560 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
27570 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
27580 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
27590 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
275a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
275b0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
275c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
275d0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
275e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
275f0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
27600 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
27610 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
27620 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
27630 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27640 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
27650 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
27660 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
27670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
27680 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
27690 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
276a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20  QLITE_OS_WINRT) 
276b0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
276c0 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
276d0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
276e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
276f0 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
27700 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
27710 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
27720 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
27730 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e  old. */.  /* Win
27740 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f  RT has no way to
27750 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74   convert a relat
27760 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61  ive path to an a
27770 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a  bsolute one. */.
27780 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
27790 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
277a0 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
277b0 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
277c0 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
277d0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
277e0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
277f0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27800 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
27810 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
27820 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
27830 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
27840 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
27850 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
27860 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
27870 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
27880 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
27890 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
278a0 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
278b0 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
278c0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
278d0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
278e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
278f0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27900 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27910 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
27920 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
27930 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27940 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
27950 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
27960 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27970 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
27980 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
27990 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
279a0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
279b0 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
279c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
279d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
279e0 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
279f0 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
27a00 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
27a10 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
27a20 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
27a30 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
27a40 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
27a50 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
27a60 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
27a70 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
27a80 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
27a90 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
27aa0 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
27ab0 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
27ac0 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
27ad0 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
27ae0 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
27af0 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76  '/' && winIsDriv
27b00 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
27b10 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a  zRelative+1) ){.
27b20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
27b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
27b40 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
27b50 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
27b60 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
27b70 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
27b80 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
27b90 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
27ba0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
27bb0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
27bc0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
27bd0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
27be0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
27bf0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
27c00 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
27c10 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
27c20 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
27c30 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
27c40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
27c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27c60 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
27c70 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
27c80 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
27c90 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
27ca0 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
27cb0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
27cc0 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
27cd0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
27ce0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
27cf0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
27d00 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
27d10 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
27d20 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
27d30 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
27d40 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
27d50 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
27d60 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
27d70 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
27d80 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
27d90 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
27da0 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
27db0 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
27dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
27dd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
27de0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
27df0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
27e00 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
27e30 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
27e40 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
27e50 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
27e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27e70 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
27e80 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
27e90 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
27ea0 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
27eb0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
27ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27ed0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
27ee0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
27ef0 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
27f00 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
27f10 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
27f20 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
27f30 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
27f40 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
27f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27f60 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27f70 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
27f80 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
27f90 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
27fa0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
27fb0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
27fe0 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
27ff0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
28000 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
28010 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
28020 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
28030 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
28040 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
28050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28060 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28070 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
28080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28090 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
280a0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
280b0 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
280c0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
280d0 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
280e0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
280f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
28100 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28110 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
28120 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
28130 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28140 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
28150 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
28160 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28170 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
281a0 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
281b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
281c0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
281d0 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
281e0 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
281f0 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
28200 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
28210 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
28220 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
28230 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
28240 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
28250 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
28260 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
28270 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
28280 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
28290 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
282a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
282b0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
282c0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
282d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
282e0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
282f0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
28300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28310 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
28320 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52  llPathname3", zR
28330 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
28340 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
28350 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
28360 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
28370 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
28380 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
28390 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
283a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
283b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
283c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
283d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
283e0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
283f0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
28400 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
28410 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
28420 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
28430 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
28440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28450 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28460 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28470 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
28480 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28490 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
284a0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
284b0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
284e0 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
284f0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
28500 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28510 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
28520 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
28530 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
28540 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
28550 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
28560 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
28570 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
28580 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
28590 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
285a0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
285b0 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
285c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
285d0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
285e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
285f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
28600 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28610 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
28620 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
28630 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
28640 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
28650 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
28660 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
28670 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
28680 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
28690 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
286a0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
286b0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
286c0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
286d0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
286e0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
286f0 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
28700 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
28710 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
28720 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
28730 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
28740 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28750 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
28760 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
28770 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
28780 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
28790 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
287a0 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
287b0 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
287c0 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
287d0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
287e0 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
287f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
28800 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
28810 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
28820 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
28830 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
28840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
28850 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
28860 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
28870 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
28880 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
28890 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
288a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
288b0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
288c0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
288d0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
288e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
288f0 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
28900 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
28910 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
28920 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
28930 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
28940 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
28950 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
28960 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
28970 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
28980 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
28990 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
289a0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
289b0 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
289c0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
289d0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
289e0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
289f0 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
28a00 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
28a10 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28a20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
28a30 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
28a40 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
28a50 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
28a60 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
28a70 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
28a80 20 20 65 6c 73 65 7b 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 41 28 28  osLoadLibraryA((
28aa0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
28ab0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
28ac0 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
28ad0 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
28ae0 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
28af0 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
28b00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28b10 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
28b20 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
28b30 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
28b40 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
28b50 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
28b60 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
28b70 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
28b80 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
28b90 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
28ba0 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
28bb0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
28bc0 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
28bd0 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
28be0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
28bf0 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
28c00 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
28c10 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
28c20 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
28c30 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
28c40 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
28c50 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
28c60 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
28c70 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
28c80 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
28c90 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
28ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
28cb0 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
28cc0 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
28cd0 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
28ce0 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
28cf0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
28d00 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
28d10 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
28d20 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
28d30 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
28d40 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
28d50 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
28d60 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
28d70 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
28d80 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
28d90 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
28da0 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
28db0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
28dc0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
28dd0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
28de0 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
28df0 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
28e00 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
28e10 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
28e20 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
28e30 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
28e40 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
28e50 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
28e60 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
28e70 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
28e80 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
28e90 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
28ea0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
28eb0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
28ec0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28ed0 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
28ee0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
28ef0 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
28f00 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
28f10 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
28f20 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
28f30 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
28f40 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
28f50 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
28f60 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65  Time(&x);.    me
28f70 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
28f80 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
28f90 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78     n += sizeof(x
28fa0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
28fb0 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
28fc0 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
28fd0 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65  pid = osGetCurre
28fe0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
28ff0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
29000 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
29010 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
29020 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
29030 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  }.#if SQLITE_OS_
29040 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65  WINRT.  if( size
29050 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e  of(ULONGLONG)<=n
29060 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f  Buf-n ){.    ULO
29070 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47  NGLONG cnt = osG
29080 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b  etTickCount64();
29090 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
290a0 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
290b0 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
290c0 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
290d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
290e0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
290f0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
29100 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  RD cnt = osGetTi
29110 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d  ckCount();.    m
29120 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29130 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
29140 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29150 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
29160 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f  ndif.  if( sizeo
29170 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
29180 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29190 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b  LARGE_INTEGER i;
291a0 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66  .    osQueryPerf
291b0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
291c0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  i);.    memcpy(&
291d0 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a  zBuf[n], &i, siz
291e0 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(i));.    n +
291f0 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d  = sizeof(i);.  }
29200 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29210 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   n;.}.../*.** Sl
29220 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
29230 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
29240 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
29250 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
29260 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
29270 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29280 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
29290 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
292a0 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
292b0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
292c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
292d0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
292e0 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
292f0 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
29300 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
29310 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
29320 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
29330 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
29340 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
29350 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
29360 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
29370 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
29380 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
29390 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
293a0 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
293b0 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
293c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
293d0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
293e0 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
293f0 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
29400 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
29410 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
29420 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
29430 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
29440 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
29450 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
29460 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
29470 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
29480 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
29490 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
294a0 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
294b0 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
294c0 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
294d0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
294e0 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
294f0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
29500 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
29510 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
29520 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
29530 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
29540 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
29550 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
29560 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
29570 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
29580 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
29590 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
295a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
295b0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
295c0 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
295d0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
295e0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
295f0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
29600 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
29610 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
29620 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45  iNow){.  /* FILE
29630 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
29640 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
29650 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
29660 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  e number of .   
29670 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64    100-nanosecond
29680 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65   intervals since
29690 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31   January 1, 1601
296a0 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35   (= JD 2305813.5
296b0 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54  ). .  */.  FILET
296c0 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63  IME ft;.  static
296d0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
296e0 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65  nt64 winFiletime
296f0 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35  Epoch = 23058135
29700 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
29710 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20  8640000;.#ifdef 
29720 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
29730 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
29740 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
29750 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(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 65 6e 64 69 66 0a 20 20 2f  0000;.#endif.  /
29780 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69  * 2^32 - to avoi
29790 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20  d use of LL and 
297a0 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20  warnings in gcc 
297b0 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
297c0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
297d0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20  max32BitValue = 
297e0 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  .      (sqlite3_
297f0 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
29800 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   + (sqlite3_int6
29810 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20  4)2000000000 +. 
29820 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
29830 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a  t64)294967296;..
29840 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
29850 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
29860 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79   time;.  osGetSy
29870 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
29880 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
29890 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
298a0 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
298b0 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
298c0 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  (!osSystemTimeTo
298d0 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26  FileTime(&time,&
298e0 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ft)){.    return
298f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29900 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74   }.#else.  osGet
29910 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
29920 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
29930 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  dif..  *piNow = 
29940 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
29950 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   +.            (
29960 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
29970 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
29980 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75  me)*max32BitValu
29990 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
299a0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
299b0 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65  t64)ft.dwLowDate
299c0 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69  Time)/(sqlite3_i
299d0 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66  nt64)10000;..#if
299e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
299f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
29a00 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
29a10 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
29a20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
29a30 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
29a40 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
29a50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
29a60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29a70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Vfs);.  return S
29a80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29a90 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
29aa0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
29ab0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
29ac0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
29ad0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
29ae0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
29af0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
29b00 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
29b10 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
29b20 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
29b30 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
29b40 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
29b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29b60 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73  winCurrentTime(s
29b70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29b80 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
29b90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
29ba0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20  lite3_int64 i;. 
29bb0 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74   rc = winCurrent
29bc0 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20  TimeInt64(pVfs, 
29bd0 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29  &i);.  if( !rc )
29be0 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69  {.    *prNow = i
29bf0 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d  /86400000.0;.  }
29c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29c10 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ./*.** The idea 
29c20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
29c30 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65  ction works like
29c40 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
29c50 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  f.** GetLastErro
29c60 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65  r() and FormatMe
29c70 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f  ssage() on Windo
29c80 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64  ws (or errno and
29c90 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
29ca0 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72   on Unix). After
29cb0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
29cc0 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a  urned by an OS.*
29cd0 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69  * function, SQLi
29ce0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
29cf0 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66  nction with zBuf
29d00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
29d10 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66  a buffer of nBuf
29d20 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c   bytes. The OS l
29d30 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75  ayer should popu
29d40 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66  late the.** buff
29d50 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65  er with a nul-te
29d60 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65  rminated UTF-8 e
29d70 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73  ncoded error mes
29d80 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69  sage.** describi
29d90 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65  ng the last IO e
29da0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63  rror to have occ
29db0 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  urred within the
29dc0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65   calling.** thre
29dd0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
29de0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
29df0 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
29e00 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
29e10 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c  fer,.** it shoul
29e20 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20  d be truncated. 
29e30 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
29e40 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f   of xGetLastErro
29e50 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  r.** is zero if 
29e60 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
29e70 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
29e80 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
29e90 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
29ea0 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
29eb0 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49  as truncated). I
29ec0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  f non-zero is re
29ed0 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  turned,.** then 
29ee0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
29ef0 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ary to include t
29f00 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  he nul-terminato
29f10 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  r character.** i
29f20 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
29f30 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73  fer..**.** Not s
29f40 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f  upplying an erro
29f50 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68  r message will h
29f60 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65  ave no adverse e
29f70 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69  ffect.** on SQLi
29f80 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74  te. It is fine t
29f90 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d  o have an implem
29fa0 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65  entation that ne
29fb0 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ver.** returns a
29fc0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a  n error message:
29fd0 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65  .**.**   int xGe
29fe0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
29ff0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2a000 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2a010 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65  uf){.**     asse
2a020 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27  rt(zBuf[0]=='\0'
2a030 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  );.**     return
2a040 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a   0;.**   }.**.**
2a050 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65   However if an e
2a060 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2a070 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c  supplied, it wil
2a080 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65  l be incorporate
2a090 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69  d.** by sqlite i
2a0a0 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nto the error me
2a0b0 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20  ssage available 
2a0c0 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e  to the user usin
2a0d0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  g.** sqlite3_err
2a0e0 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20  msg(), possibly 
2a0f0 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73  making IO errors
2a100 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67   easier to debug
2a110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a120 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28  winGetLastError(
2a130 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2a140 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2a150 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
2a160 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2a170 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e  s);.  return win
2a180 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
2a190 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2a1a0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d  , nBuf, zBuf);.}
2a1b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2a1c0 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c  ze and deinitial
2a1d0 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
2a1e0 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
2a1f0 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
2a200 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29  e3_os_init(void)
2a210 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
2a220 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20  e3_vfs winVfs = 
2a230 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2a240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2a250 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2a260 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2a270 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2a280 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2a290 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
2a2a0 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2a2b0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a2d0 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2a2e0 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  n32",           
2a2f0 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2a300 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2a310 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2a320 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2a330 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2a340 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2a350 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2a360 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2a370 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2a380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2a390 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2a3a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2a3b0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2a3c0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2a3d0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2a3e0 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2a3f0 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2a400 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2a410 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2a420 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
2a430 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2a440 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2a450 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2a460 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2a470 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2a480 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2a490 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2a4a0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2a4b0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2a4c0 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
2a4d0 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2a4e0 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2a4f0 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
2a500 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
2a510 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2a520 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
2a530 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2a540 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2a550 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
2a560 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2a570 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2a580 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
2a590 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2a5a0 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2a5b0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2a5c0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69  mCall */.  };.#i
2a5d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2a5e0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2a5f0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2a600 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74  3_vfs winLongPat
2a610 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  hVfs = {.    3, 
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2a640 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2a650 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
2a660 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2a670 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
2a680 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2a690 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2a6a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a6b0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2a6c0 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70      "win32-longp
2a6d0 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d  ath",    /* zNam
2a6e0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a700 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2a710 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2a720 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
2a730 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
2a740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2a750 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2a760 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2a770 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2a780 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2a790 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
2a7a0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2a7b0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2a7c0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2a7d0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2a7e0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2a7f0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2a800 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2a810 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2a820 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2a830 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2a840 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2a850 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2a860 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2a870 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
2a880 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2a890 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2a8a0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2a8b0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2a8c0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2a8d0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2a8e0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2a8f0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2a900 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
2a910 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2a920 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2a930 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2a940 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2a950 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2a960 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2a970 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2a980 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2a990 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
2a9a0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2a9b0 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f    };.#endif..  /
2a9c0 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  * Double-check t
2a9d0 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c  hat the aSyscall
2a9e0 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65  [] array has bee
2a9f0 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  n constructed.  
2aa00 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53  ** correctly.  S
2aa10 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38  ee ticket [bb3a8
2aa20 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f  6e890c8e96ab] */
2aa30 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
2aa40 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d  Size(aSyscall)==
2aa50 37 36 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20  76 );..  /* get 
2aa60 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63  memory map alloc
2aa70 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74  ation granularit
2aa80 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77  y */.  memset(&w
2aa90 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69  inSysInfo, 0, si
2aaa0 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f  zeof(SYSTEM_INFO
2aab0 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ));.#if SQLITE_O
2aac0 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e  S_WINRT.  osGetN
2aad0 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28  ativeSystemInfo(
2aae0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2aaf0 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
2ab00 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
2ab10 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  o);.#endif.  ass
2ab20 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2ab30 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
2ab40 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61  ularity>0 );.  a
2ab50 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
2ab60 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29  o.dwPageSize>0 )
2ab70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
2ab80 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
2ab90 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69  s, 1);..#if defi
2aba0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2abb0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c  _HAS_WIDE).  sql
2abc0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
2abd0 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66  r(&winLongPathVf
2abe0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  s, 0);.#endif.. 
2abf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ac00 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  K; .}..int sqlit
2ac10 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
2ac20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   .#if SQLITE_OS_
2ac30 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
2ac40 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
2ac50 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
2ac60 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
2ac70 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
2ac80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2ac90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2aca0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2acb0 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.