/ Hex Artifact Content
Login

Artifact 16eac0961603182ffc10c02b39fe830126538e07:


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 53 59 53 54 45 4d 5f 49 4e  ze..*/.SYSTEM_IN
18890 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
188a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
188b0 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
188c0 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
188d0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
188e0 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
188f0 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
18900 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
18910 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
18920 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
18930 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
18940 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c  y .** this file,
18950 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
18960 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d  y be shared by m
18970 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
18980 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
18990 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
189a0 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
189b0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
189c0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
189d0 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
189e0 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
189f0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
18a00 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
18a10 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
18a20 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
18a30 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
18a40 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
18a50 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
18a60 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
18a70 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
18a80 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
18a90 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
18aa0 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
18ab0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
18ac0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
18ad0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
18ae0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
18af0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
18b00 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
18b10 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
18b20 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
18b30 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
18b40 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
18b50 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
18b60 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18b70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
18b80 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
18b90 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
18ba0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18bb0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
18bc0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
18bd0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
18be0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18bf0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
18c00 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
18c10 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
18c20 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
18c30 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
18c40 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
18c50 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
18c60 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
18c70 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
18c80 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
18c90 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
18ca0 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
18cb0 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
18cc0 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
18cd0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
18ce0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
18cf0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
18d00 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
18d10 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
18d20 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
18d30 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
18d40 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
18d50 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
18d60 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
18d70 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
18d80 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
18d90 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
18da0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
18db0 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
18dc0 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
18dd0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18de0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
18df0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
18e00 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18e10 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
18e20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
18e30 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
18e40 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
18e50 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
18e60 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
18e70 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
18e80 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
18e90 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
18ea0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
18eb0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
18ec0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
18ed0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
18ee0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
18ef0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18f00 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
18f10 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
18f20 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
18f30 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
18f40 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18f50 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
18f60 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
18f70 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
18f80 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
18f90 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
18fa0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fc0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
18fd0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
18fe0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19000 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
19010 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
19020 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
19030 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
19040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19050 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
19060 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
19070 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
19080 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
19090 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
190a0 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
190b0 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
190c0 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
190d0 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
190e0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
19110 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
19120 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
19130 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
19140 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19150 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
19160 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
19170 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
19180 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
19190 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
191a0 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
191b0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
191c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
191d0 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
191e0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
191f0 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
19200 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
19210 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
19220 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
19230 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
19240 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
19250 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
19260 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
19270 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
19280 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
19290 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
192a0 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
192b0 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
192c0 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
192d0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
192e0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
192f0 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
19300 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
19310 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
19320 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
19330 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
19340 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
19350 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
19360 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
19370 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
19380 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
19390 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
193a0 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
193b0 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
193c0 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
193d0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
193e0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
193f0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
19400 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
19410 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
19420 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
19430 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
19440 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
19450 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
19460 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
19470 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
19480 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19490 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
194a0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
194b0 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
194c0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
194d0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
194e0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
194f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19500 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
19510 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
19520 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
19530 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
19540 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19550 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19560 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19580 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
19590 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
195a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
195b0 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
195e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
195f0 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
19600 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
19610 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
19620 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
19630 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
19640 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
19650 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
19660 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
19670 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
19680 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
19690 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
196a0 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
196b0 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
196c0 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
196d0 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
196e0 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
196f0 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
19700 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
19710 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
19720 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
19730 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
19740 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
19750 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
19760 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
19770 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
19780 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
19790 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
197a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
197b0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
197c0 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
197d0 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
197e0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
197f0 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
19800 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
19810 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
19820 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
19830 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
19840 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
19850 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
19860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
19870 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
19880 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
19890 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
198a0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
198b0 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
198c0 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
198d0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
198e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
198f0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
19900 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
19910 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
19920 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19930 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
19940 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
19950 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
19960 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
19970 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74   lock=%d, offset
19980 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c  =%d, size=%d\n",
19990 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
199a0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b  e->hFile.h, lock
199b0 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74  Type, ofst, nByt
199c0 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  e));..  /* Relea
199d0 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
199e0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
199f0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
19a00 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29  pe==_SHM_UNLCK )
19a10 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e  {.    rc = winUn
19a20 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
19a30 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
19a40 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
19a50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
19a60 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
19a70 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
19a80 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
19a90 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
19aa0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
19ab0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
19ac0 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
19ad0 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
19ae0 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
19af0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  _LOCK;.    rc = 
19b00 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
19b10 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
19b20 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  lags, ofst, 0, n
19b30 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Byte, 0);.  }.  
19b40 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
19b50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19b60 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
19b70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
19b80 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
19b90 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
19ba0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19bb0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
19bc0 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
19bd0 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
19be0 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
19bf0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
19c00 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
19c10 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43  ype == _SHM_UNLC
19c20 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46  K) ? "winUnlockF
19c30 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ile" :.         
19c40 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c    "winLockFile",
19c50 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19c60 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  o, sqlite3ErrNam
19c70 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75  e(rc)));..  retu
19c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
19c90 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
19ca0 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
19cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19cc0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
19cd0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
19ce0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
19cf0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
19d00 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
19d10 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
19d20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
19d30 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
19d40 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
19d50 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
19d60 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
19d70 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
19d80 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
19d90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19da0 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
19db0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
19dc0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
19dd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19de0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
19df0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
19e00 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
19e10 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
19e20 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
19e30 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
19e40 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73  hmNode *p;.  ass
19e50 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
19e60 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52  Held() );.  OSTR
19e70 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
19e80 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46  pid=%lu, deleteF
19e90 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lag=%d\n",.     
19ea0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
19eb0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64  ntProcessId(), d
19ec0 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70  eleteFlag));.  p
19ed0 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
19ee0 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
19ef0 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
19f00 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
19f10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
19f20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
19f30 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d  tex ){ sqlite3_m
19f40 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
19f50 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72  ex); }.      for
19f60 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
19f70 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
19f80 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55    BOOL bRc = osU
19f90 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
19fa0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
19fb0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
19fc0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
19fd0 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  UNMAP pid=%lu, r
19fe0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
19ff0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a000 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1a010 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
1a020 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
1a030 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1a040 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
1a050 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
1a060 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
1a070 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
1a080 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
1a090 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1a0a0 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45  "SHM-PURGE-CLOSE
1a0b0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1a0c0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1a0f0 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1a100 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1a110 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1a120 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1a130 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d  UE(bRc);.      }
1a140 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46  .      if( p->hF
1a150 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  ile.h!=NULL && p
1a160 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c  ->hFile.h!=INVAL
1a170 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1a180 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1a190 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a1a0 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
1a1b0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
1a1c0 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
1a1d0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1a1e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a1f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1a200 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
1a210 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1a220 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a230 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
1a240 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
1a250 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1a260 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
1a270 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
1a280 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1a290 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1a2a0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
1a2b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a2c0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1a2d0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
1a2e0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
1a2f0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
1a300 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1a310 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1a320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
1a330 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
1a340 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a350 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
1a360 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1a370 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1a380 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1a390 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
1a3a0 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
1a3b0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
1a3c0 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
1a3d0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
1a3e0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
1a3f0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
1a400 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1a410 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1a420 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1a430 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1a440 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1a450 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1a460 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
1a470 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1a480 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1a490 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
1a4a0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1a4b0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1a4c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1a4d0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1a4e0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1a4f0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1a500 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
1a510 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1a520 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1a530 20 69 6e 74 20 72 63 3b 20 20 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 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1a560 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
1a570 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
1a580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a590 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
1a5a0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
1a5b0 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
1a5e0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
1a5f0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
1a600 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
1a610 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
1a620 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
1a630 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1a640 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
1a650 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
1a660 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
1a670 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
1a680 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1a690 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
1a6a0 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
1a6b0 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
1a6c0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1a6d0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
1a6e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a6f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1a700 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1a710 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a  trlen30(pDbFd->z
1a720 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Path);.  pNew = 
1a730 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1a740 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  o( sizeof(*pShmN
1a750 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ode) + nName + 1
1a760 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  7 );.  if( pNew=
1a770 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a780 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72  3_free(p);.    r
1a790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a7a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1a7b0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
1a7c0 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
1a7d0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1a7e0 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20  rintf(nName+15, 
1a7f0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
1a800 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
1a810 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69  ->zPath);.  sqli
1a820 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
1a830 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65  DbFd->zPath, pNe
1a840 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a  w->zFilename); .
1a850 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
1a860 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1a870 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
1a880 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
1a890 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
1a8a0 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
1a8b0 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
1a8c0 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
1a8d0 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
1a8e0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1a8f0 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
1a900 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
1a910 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
1a920 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
1a930 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
1a940 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
1a950 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
1a960 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
1a970 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
1a980 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
1a990 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
1a9a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1a9b0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1a9c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
1a9d0 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
1a9e0 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
1a9f0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
1aa00 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
1aa10 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1aa20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
1aa30 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
1aa40 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
1aa50 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
1aa60 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
1aa70 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1aa80 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
1aa90 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
1aaa0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1aab0 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
1aac0 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
1aad0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1aae0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1aaf0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1ab00 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1ab10 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1ab20 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1ab30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1ab40 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1ab50 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1ab60 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1ab70 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
1ab80 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
1ab90 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1aba0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1abc0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1abd0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1abf0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
1ac00 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
1ac10 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
1ac20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1ac30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1ac40 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  N_WAL | SQLITE_O
1ac50 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1ac60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ac70 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
1ac80 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
1ac90 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1aca0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  {.      goto shm
1acb0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1acc0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1acd0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1ace0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1acf0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1ad00 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
1ad10 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1ad20 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1ad30 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
1ad40 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
1ad50 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1ad60 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1ad70 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1ad80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ad90 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1ada0 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1adb0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1adc0 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1add0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ade0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1adf0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1ae00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1ae10 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1ae20 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1ae50 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1ae60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ae70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ae80 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1ae90 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1aea0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1aeb0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1aec0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1aed0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1aee0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1aef0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1af00 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1af10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1af20 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
1af30 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1af40 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1af50 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
1af60 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1af70 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1af80 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1af90 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
1afa0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1afb0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1afc0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1afd0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1afe0 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1aff0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1b000 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1b010 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1b020 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1b030 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1b040 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1b050 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1b060 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1b070 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1b080 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1b090 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1b0a0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1b0b0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1b0c0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1b0d0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1b0e0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1b0f0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1b100 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1b110 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1b120 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1b130 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1b140 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1b150 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1b160 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
1b170 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1b180 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b190 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1b1a0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1b1b0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1b1c0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1b1d0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1b1e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b1f0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1b200 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1b220 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1b230 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1b240 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
1b250 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1b260 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1b270 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1b280 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
1b290 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
1b2a0 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
1b2b0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1b2c0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1b2d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1b2e0 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
1b2f0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
1b300 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1b310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b320 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1b330 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1b340 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1b350 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1b360 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
1b370 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1b380 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1b390 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
1b3a0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1b3b0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1b3c0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1b3d0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1b3e0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1b3f0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1b400 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
1b410 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
1b420 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1b430 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1b440 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1b450 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1b460 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
1b470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b480 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1b490 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
1b4a0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1b4b0 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
1b4c0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
1b4d0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1b4e0 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
1b4f0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1b500 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1b510 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1b520 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
1b530 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
1b540 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
1b550 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1b560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
1b570 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1b580 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
1b590 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1b5a0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1b5b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1b5c0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1b5d0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1b5e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b5f0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1b600 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1b610 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1b620 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1b630 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1b640 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1b650 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1b660 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1b670 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1b680 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1b690 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1b6a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1b6b0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1b6c0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1b6d0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1b6e0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1b6f0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1b700 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1b710 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1b720 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1b730 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1b740 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1b750 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1b760 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1b770 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1b780 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
1b790 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1b7a0 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
1b7b0 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
1b7c0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1b7d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b7e0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1b7f0 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1b800 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1b810 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1b820 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
1b830 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1b840 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1b850 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1b860 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1b870 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1b880 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1b890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1b8a0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1b8b0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1b8c0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b8e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1b8f0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1b900 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1b910 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1b920 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1b930 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1b940 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
1b950 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1b960 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
1b970 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1b980 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1b990 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1b9a0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1b9b0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1b9c0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1b9d0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1b9e0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
1b9f0 70 58 3b 20 20 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 2f 2a                /*
1ba10 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1ba20 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1ba30 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1ba40 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1ba50 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1ba60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1ba90 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 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 2f 2a 20 4d 61 73            /* Mas
1bac0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1bad0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1bae0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
1baf0 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1bb00 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1bb10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1bb20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1bb30 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1bb40 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1bb50 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1bb60 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1bb70 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1bb80 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1bb90 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1bba0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1bbb0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1bbc0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1bbd0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1bbe0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1bbf0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1bc00 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1bc10 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1bc20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1bc30 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1bc40 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1bc50 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
1bc60 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
1bc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
1bc80 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
1bc90 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
1bca0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1bcb0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1bcc0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1bcd0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1bce0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
1bcf0 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
1bd00 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1bd10 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
1bd20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
1bd30 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
1bd40 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
1bd50 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1bd60 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1bd70 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1bd80 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
1bd90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bda0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
1bdb0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
1bdc0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
1bdd0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
1bde0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1bdf0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1be00 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
1be10 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
1be20 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
1be30 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
1be40 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1be50 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1be60 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1be70 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
1be80 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1be90 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
1bea0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1beb0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
1bec0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1bed0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1bee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bef0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
1bf00 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1bf10 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1bf20 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1bf30 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
1bf40 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1bf50 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
1bf60 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
1bf70 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
1bf80 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1bf90 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
1bfa0 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
1bfb0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
1bfc0 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
1bfd0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
1bfe0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
1bff0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
1c000 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
1c010 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
1c020 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1c030 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
1c040 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
1c050 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
1c060 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1c070 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1c080 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1c090 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1c0a0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1c0b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1c0c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1c0d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
1c0f0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
1c100 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1c110 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
1c120 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
1c130 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
1c140 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
1c150 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1c170 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
1c180 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1c190 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1c1a0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1c1b0 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
1c1c0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1c1d0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
1c1e0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1c1f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c200 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1c210 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
1c220 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
1c230 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1c250 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
1c260 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1c270 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
1c280 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
1c290 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
1c2a0 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
1c2b0 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
1c2c0 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
1c2d0 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
1c2e0 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
1c2f0 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
1c300 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1c310 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1c320 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1c330 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1c340 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
1c350 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
1c360 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1c370 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c380 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1c390 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c3a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1c3b0 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
1c3c0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
1c3d0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
1c3e0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
1c3f0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
1c400 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
1c410 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
1c420 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
1c430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c450 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1c460 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1c470 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
1c480 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1c490 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1c4a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c4b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
1c4c0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1c4d0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
1c4e0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
1c4f0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
1c500 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1c510 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1c520 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c530 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1c540 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64  LOCK pid=%lu, id
1c550 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d  =%d, sharedMask=
1c560 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25  %03x, exclMask=%
1c570 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  03x, rc=%s\n",. 
1c580 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1c590 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1c5a0 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61  ), p->id, p->sha
1c5b0 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
1c5c0 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
1c5d0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1c5e0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
1c5f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1c600 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
1c610 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
1c620 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
1c630 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
1c640 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
1c650 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
1c660 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
1c670 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
1c680 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
1c690 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
1c6a0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
1c6b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1c6c0 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
1c6d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1c6e0 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
1c6f0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c700 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1c710 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
1c720 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1c730 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72  .  /* MemoryBarr
1c740 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e  ier(); // does n
1c750 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f  ot work -- do no
1c760 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a  t know why not *
1c770 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1c780 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d  utex();.  winShm
1c790 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
1c7a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c7b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1c7c0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
1c7d0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
1c7e0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
1c7f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
1c800 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1c810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c820 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
1c830 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
1c840 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
1c850 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
1c860 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
1c870 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
1c880 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
1c890 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
1c8a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c8b0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1c8c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c8d0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1c8e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
1c8f0 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72  ise, if the isWr
1c900 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ite parameter is
1c910 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
1c920 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
1c930 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
1c940 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1c950 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
1c960 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
1c970 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
1c980 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
1c990 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
1c9a0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1c9b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1c9c0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72  ned. If .** isWr
1c9d0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
1c9e0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1c9f0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1ca00 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
1ca10 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
1ca20 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
1ca30 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
1ca40 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1ca50 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
1ca60 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
1ca70 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
1ca80 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
1ca90 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
1caa0 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
1cab0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
1cac0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
1cad0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1cae0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
1caf0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1cb00 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
1cb10 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1cb20 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
1cb30 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
1cb40 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
1cb50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1cb60 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
1cb70 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1cb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1cb90 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
1cba0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1cbb0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cbd0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
1cbe0 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
1cbf0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1cc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1cc10 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
1cc20 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20    int isWrite,  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
1cc50 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
1cc60 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
1cc70 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
1cc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1cc90 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
1cca0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1ccb0 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
1ccc0 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d  le*)fd;.  winShm
1ccd0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1cce0 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  m;.  winShmNode 
1ccf0 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1cd00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cd10 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
1cd20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
1cd30 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
1cd40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cd50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1cd60 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44  n rc;.    p = pD
1cd70 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1cd80 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1cd90 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69  ShmNode;..  sqli
1cda0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1cdb0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1cdc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
1cdd0 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
1cde0 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
1cdf0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
1ce00 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1ce10 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1ce20 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
1ce30 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
1ce40 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1ce50 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
1ce60 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
1ce70 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
1ce80 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
1ce90 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
1cea0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1ceb0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
1cec0 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
1ced0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1cee0 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
1cef0 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
1cf00 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
1cf10 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
1cf20 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
1cf30 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
1cf40 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
1cf50 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1cf60 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
1cf70 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
1cf80 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
1cf90 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
1cfa0 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
1cfb0 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
1cfc0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
1cfd0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
1cfe0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
1cff0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1d000 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1d010 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1d020 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1d030 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
1d040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d050 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1d060 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1d070 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1d080 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31       "winShmMap1
1d0b0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1d0c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1d0d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1d0e0 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74  .    if( sz<nByt
1d0f0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
1d100 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1d110 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
1d120 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57  ot exist. If isW
1d130 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20  rite is set to. 
1d140 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78       ** zero, ex
1d150 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
1d160 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
1d170 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1d180 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
1d190 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
1d1a0 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73  rnatively, if is
1d1b0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1d1c0 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  o, use ftruncate
1d1d0 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
1d1e0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
1d1f0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1d200 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1d210 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65      if( !isWrite
1d220 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
1d230 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  out;.      rc = 
1d240 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1d250 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1d260 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42  mNode->hFile, nB
1d270 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
1d280 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1d2a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1d2b0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1d2c0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1d2d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d2e0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1d2f0 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
1d300 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1d310 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1d320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d330 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
1d340 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1d350 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
1d360 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1d370 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
1d380 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
1d390 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
1d3a0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
1d3b0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1d3c0 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
1d3d0 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
1d3e0 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
1d3f0 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
1d400 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d410 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1d420 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1d430 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1d440 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1d450 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
1d460 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
1d470 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
1d480 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
1d490 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20  LE hMap = NULL; 
1d4a0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
1d4b0 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
1d4c0 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
1d4d0 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
1d4e0 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
1d4f0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
1d500 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f      .#if SQLITE_
1d510 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
1d520 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1d530 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
1d540 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1d550 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1d560 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d570 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a  TE, nByte, NULL.
1d580 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
1d590 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1d5a0 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1d5b0 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1d5c0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1d5d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1d5e0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55  h, .          NU
1d5f0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d600 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1d610 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1d620 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d630 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1d640 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1d650 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1d660 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gA(pShmNode->hFi
1d670 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
1d680 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1d690 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1d6a0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1d6b0 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1d6c0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52  ACE(("SHM-MAP-CR
1d6d0 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  EATE pid=%lu, re
1d6e0 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64  gion=%d, size=%d
1d6f0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d700 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d710 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d720 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1d730 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
1d750 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
1d760 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
1d770 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
1d780 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
1d790 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d7a0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
1d7b0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1d7c0 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1d7d0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1d7e0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1d7f0 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
1d800 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
1d810 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
1d820 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
1d830 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
1d840 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
1d850 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
1d860 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1d870 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1d880 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1d890 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
1d8a0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1d8b0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1d8c0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1d8d0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1d8e0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1d8f0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
1d900 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
1d910 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
1d920 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
1d930 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
1d940 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1d950 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
1d960 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
1d970 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1d980 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1d990 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d9a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d9b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1d9c0 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
1d9e0 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
1d9f0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1da00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1da10 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
1da20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
1da30 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1da40 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1da50 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1da60 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1da70 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
1da80 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1dab0 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
1dac0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
1dad0 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
1dae0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
1daf0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1db00 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1db10 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1db20 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1db30 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
1db40 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
1db50 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1db60 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1db70 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
1db80 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1db90 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1dba0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1dbb0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1dbc0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1dbd0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
1dbe0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
1dbf0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
1dc00 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1dc10 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1dc20 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1dc30 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1dc40 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
1dc50 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
1dc60 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
1dc70 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
1dc80 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
1dc90 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
1dca0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1dcb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1dcc0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1dcd0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1dce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1dcf0 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
1dd00 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
1dd10 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
1dd20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1dd30 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
1dd40 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
1dd50 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
1dd60 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1dd70 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
1dd80 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65  ** Cleans up the
1dd90 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f   mapped region o
1dda0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1ddb0 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  file, if any..*/
1ddc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1ddd0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
1dde0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
1ddf0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
1de00 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  le){.  assert( p
1de10 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54  File!=0 );.  OST
1de20 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1de30 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1de40 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d  =%p, hMap=%p, pM
1de50 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1de60 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53            "mmapS
1de70 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ize=%lld, mmapSi
1de80 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d  zeActual=%lld, m
1de90 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c  mapSizeMax=%lld\
1dea0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1deb0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1dec0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
1ded0 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c  File->hMap, pFil
1dee0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20  e->pMapRegion,. 
1def0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1df00 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65  >mmapSize, pFile
1df10 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1df20 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  , pFile->mmapSiz
1df30 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46  eMax));.  if( pF
1df40 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1df50 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e  ){.    if( !osUn
1df60 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
1df70 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1df80 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1df90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1dfa0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1dfb0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
1dfc0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1dfd0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
1dfe0 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
1e000 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1e010 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
1e020 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e030 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
1e040 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61        pFile->pMa
1e050 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
1e060 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1e070 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e080 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1e090 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31    "winUnmapfile1
1e0c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1e0d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1e0e0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
1e0f0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
1e100 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
1e110 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
1e120 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  ctual = 0;.  }. 
1e130 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
1e140 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
1e150 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
1e160 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
1e170 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1e180 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1e190 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1e1a0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1e1b0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1e1c0 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25  pFile=%p, hMap=%
1e1d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1e1e0 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
1e1f0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1e200 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1e210 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1e220 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20  ->hMap));.      
1e230 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
1e240 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e250 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
1e260 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22   "winUnmapfile2"
1e290 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e2a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1e2b0 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
1e2c0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55   }.  OSTRACE(("U
1e2d0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1e2e0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1e2f0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1e300 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e310 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e320 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  , pFile));.  ret
1e330 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e340 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
1e350 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
1e360 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
1e370 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1e380 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
1e390 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
1e3a0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
1e3b0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
1e3c0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
1e3d0 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
1e3e0 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
1e3f0 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
1e400 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
1e410 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
1e420 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
1e430 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
1e440 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
1e450 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1e460 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
1e470 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
1e480 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
1e490 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
1e4a0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
1e4b0 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
1e4c0 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
1e4d0 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
1e4e0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
1e4f0 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
1e500 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
1e510 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
1e520 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
1e530 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
1e540 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
1e550 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
1e560 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
1e570 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
1e580 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
1e590 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
1e5a0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
1e5b0 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d   whichever is sm
1e5c0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  aller..**.** SQL
1e5d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e5e0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
1e5f0 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74  ccurs (even if t
1e600 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1e610 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61  t.** recreated a
1e620 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75  s a result of ou
1e630 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1e640 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69  nces) or an SQLi
1e650 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
1e660 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1e670 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70  tatic int winMap
1e680 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1e690 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
1e6a0 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74   nByte){.  sqlit
1e6b0 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20  e3_int64 nMap = 
1e6c0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b  nByte;.  int rc;
1e6d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
1e6e0 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74  >=0 || pFd->nFet
1e6f0 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53  chOut==0 );.  OS
1e700 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1e710 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1e720 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22  %p, size=%lld\n"
1e730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1e740 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1e750 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65  Id(), pFd, nByte
1e760 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e  ));..  if( pFd->
1e770 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
1e780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e790 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
1e7a0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1e7b0 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1e7c0 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29  ile*)pFd, &nMap)
1e7d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1e7e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e7f0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e800 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1e810 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1e820 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  T\n",.          
1e830 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e840 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1e850 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d));.      retur
1e860 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1e870 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  STAT;.    }.  }.
1e880 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e    if( nMap>pFd->
1e890 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20  mmapSizeMax ){. 
1e8a0 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d     nMap = pFd->m
1e8b0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a  mapSizeMax;.  }.
1e8c0 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69    nMap &= ~(sqli
1e8d0 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79  te3_int64)(winSy
1e8e0 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1e8f0 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e   - 1);. .  if( n
1e900 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
1e910 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
1e920 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1e930 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
1e940 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
1e950 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
1e960 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
1e970 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
1e980 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1e990 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
1e9a0 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
1e9b0 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1e9c0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46  Fd);.    if( (pF
1e9d0 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
1e9e0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
1e9f0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
1ea00 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
1ea10 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
1ea20 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
1ea30 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  TE;.    }.#if SQ
1ea40 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1ea50 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1ea60 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1ea70 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c  gFromApp(pFd->h,
1ea80 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20   NULL, protect, 
1ea90 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  nMap, NULL);.#el
1eaa0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1eab0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1eac0 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  ).    pFd->hMap 
1ead0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1eae0 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e  ppingW(pFd->h, N
1eaf0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, 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 28 44                (D
1eb20 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
1eb30 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
1eb40 20 20 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 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
1eb70 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1eb80 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1eb90 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1eba0 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d  S_ANSI).    pFd-
1ebb0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1ebc0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64  FileMappingA(pFd
1ebd0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1ebe0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61      (DWORD)((nMa
1ec10 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  p>>32) & 0xfffff
1ec20 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d        (DWORD)(nM
1ec50 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ap & 0xffffffff)
1ec60 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
1ec70 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61      if( pFd->hMa
1ec80 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
1ec90 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
1eca0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1ecb0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1ecc0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1ecd0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1ece0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
1ed10 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  1", pFd->zPath);
1ed20 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
1ed30 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
1ed40 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
1ed50 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
1ed60 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
1ed70 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1ed80 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64  -FILE-CREATE pid
1ed90 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1eda0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1edb0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1edc0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1edd0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1ede0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1edf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ee00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  _OK;.    }.    a
1ee10 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77  ssert( (nMap % w
1ee20 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
1ee30 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Size)==0 );.    
1ee40 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53  assert( sizeof(S
1ee50 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73  IZE_T)==sizeof(s
1ee60 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c  qlite3_int64) ||
1ee70 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66   nMap<=0xfffffff
1ee80 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  f );.#if SQLITE_
1ee90 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65  OS_WINRT.    pNe
1eea0 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
1eeb0 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ileFromApp(pFd->
1eec0 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
1eed0 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23  (SIZE_T)nMap);.#
1eee0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
1eef0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1ef00 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1ef10 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  , 0, 0, (SIZE_T)
1ef20 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nMap);.#endif.  
1ef30 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
1ef40 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73   ){.      osClos
1ef50 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61  eHandle(pFd->hMa
1ef60 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68  p);.      pFd->h
1ef70 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Map = NULL;.    
1ef80 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1ef90 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1efa0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1efb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1efc0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1efd0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1f000 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e2", pFd->zPath)
1f010 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1f020 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1f030 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1f040 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1f050 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1f060 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1f070 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25  P-FILE-MAP pid=%
1f080 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1f090 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1f0a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f0b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f0c0 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
1f0d0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1f0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f0f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
1f100 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
1f110 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
1f120 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
1f130 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
1f140 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
1f150 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1f160 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1f170 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1f180 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1f190 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f1a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f1b0 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
1f1c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1f1d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
1f1e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
1f1f0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
1f200 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
1f210 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
1f220 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
1f230 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
1f240 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
1f250 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
1f260 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
1f270 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
1f280 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
1f290 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
1f2a0 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
1f2b0 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
1f2c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1f2d0 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
1f2e0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
1f2f0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
1f300 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
1f310 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
1f320 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1f330 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
1f340 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1f350 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
1f360 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
1f370 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
1f380 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1f390 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
1f3a0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
1f3b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
1f3c0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
1f3d0 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
1f3e0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
1f3f0 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
1f400 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
1f410 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
1f420 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1f430 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
1f440 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
1f450 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
1f460 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f470 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
1f480 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1f490 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1f4a0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1f4b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
1f4c0 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1f4d0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
1f4e0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
1f4f0 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
1f500 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
1f510 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f520 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f530 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
1f540 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
1f550 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1f560 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
1f570 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
1f580 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
1f590 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
1f5a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1f5b0 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
1f5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f5d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f5e0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1f5f0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1f600 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1f610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f620 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f630 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1f640 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1f650 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1f660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f670 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1f680 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
1f690 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
1f6a0 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
1f6b0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
1f6c0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
1f6d0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
1f6e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1f6f0 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
1f700 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1f710 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
1f720 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
1f730 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1f740 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f750 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
1f760 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
1f770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f780 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1f790 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
1f7a0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
1f7b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1f7c0 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
1f7d0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
1f7e0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1f7f0 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
1f800 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
1f810 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1f820 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1f830 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
1f840 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
1f850 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
1f860 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
1f870 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
1f880 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
1f890 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
1f8a0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
1f8b0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1f8c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1f8d0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a  s being called .
1f8e0 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
1f8f0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
1f900 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
1f910 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
1f920 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61  g mapping .** ma
1f930 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
1f940 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
1f950 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
1f960 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
1f970 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1f980 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
1f990 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
1f9a0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1f9b0 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
1f9c0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1f9d0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1f9e0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1f9f0 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
1fa00 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
1fa10 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
1fa20 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1fa30 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
1fa40 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
1fa50 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
1fa60 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
1fa70 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
1fa80 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
1fa90 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1faa0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
1fab0 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
1fac0 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
1fad0 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
1fae0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
1faf0 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
1fb00 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
1fb10 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
1fb20 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
1fb30 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
1fb40 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
1fb50 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
1fb60 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1fb70 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
1fb80 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  ld, p=%p\n",.   
1fb90 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1fba0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1fbb0 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b   pFd, iOff, p));
1fbc0 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
1fbd0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
1fbe0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
1fbf0 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69  /* FIXME:  If Wi
1fc00 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61  ndows truly alwa
1fc10 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e  ys prevents trun
1fc20 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69  cating or deleti
1fc30 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ng a.    ** file
1fc40 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67   while a mapping
1fc50 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74   is held, then t
1fc60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e  he following win
1fc70 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c  Unmapfile() call
1fc80 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63  .    ** is unnec
1fc90 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62  essary can can b
1fca0 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
1fcb0 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
1fcc0 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
1fcd0 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
1fce0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1fcf0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1fd00 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
1fd10 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
1fd20 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
1fd30 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1fd40 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1fd50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fd60 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1fd70 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
1fd80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
1fda0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1fdb0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1fdc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1fdd0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1fde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1fdf0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1fe00 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   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 0a 2a 2a 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 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1fe80 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
1fe90 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
1fea0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
1feb0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
1fec0 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
1fed0 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
1fee0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1fef0 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
1ff00 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  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 2f 2a 20 69 56             /* iV
1ff30 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
1ff40 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ff60 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
1ff70 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
1ff80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
1ff90 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
1ffa0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1ffc0 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
1ffd0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1ffe0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1fff0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
20000 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
20010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
20020 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
20030 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
20040 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
20050 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
20060 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
20080 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
20090 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
200a0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
200b0 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
200c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
200d0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
200e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
200f0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
20100 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
20110 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
20120 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
20130 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
20140 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
20150 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
20160 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20170 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
20180 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20190 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
201a0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
201b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
201c0 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
201d0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
201e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
201f0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
20200 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
20210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20220 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
20230 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
20260 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
20290 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
202c0 7d 3b 0a 0a 2f 2a 2a 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 0a 2a 2a 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 20 73  ************** s
20330 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
20340 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
20350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
20360 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
20370 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
20380 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20390 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
203a0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
203b0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66   object..*/..#if
203c0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
203d0 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  N__)./*.** Conve
203e0 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72  rt a filename fr
203f0 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20  om whatever the 
20400 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
20410 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73  ting system.** s
20420 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65  upports for file
20430 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38  names into UTF-8
20440 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
20450 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a   the result is.*
20460 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
20470 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
20480 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
20490 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
204a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
204b0 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74   *winConvertToUt
204c0 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
204d0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
204e0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76  ){.  char *zConv
204f0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
20500 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
20510 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
20520 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
20530 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
20540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
20550 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
20560 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
20570 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
20580 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
20590 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
205a0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
205b0 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
205c0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
205d0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
205e0 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ted;.}.#endif../
205f0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
20600 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e  TF-8 filename in
20610 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
20620 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
20630 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
20640 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61  tem wants filena
20650 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74  mes in.  Space t
20660 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
20670 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  t.** is obtained
20680 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
20690 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
206a0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
206b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
206c0 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f  atic void *winCo
206d0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
206e0 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
206f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
20700 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
20710 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
20720 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
20730 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38  verted = winUtf8
20740 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
20750 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
20760 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
20770 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
20780 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20790 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
207a0 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
207b0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
207c0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
207d0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
207e0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
207f0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
20800 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20810 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
20820 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
20830 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73  pecified UTF-8 s
20840 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20  tring buffer.** 
20850 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65  ends with a dire
20860 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
20870 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65  character or one
20880 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
20890 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74  y.** added to it
208a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
208b0 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
208c0 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  ep(int nBuf, cha
208d0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20  r *zBuf){.  if( 
208e0 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  zBuf ){.    int 
208f0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
20900 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
20910 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a    if( nLen>0 ){.
20920 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
20930 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d  irSep(zBuf[nLen-
20940 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  1]) ){.        r
20950 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
20960 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c  else if( nLen+1<
20970 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
20980 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e  zBuf[nLen] = win
20990 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20  GetDirSep();.   
209a0 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31       zBuf[nLen+1
209b0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
209c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
209d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
209e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
209f0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
20a00 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
20a10 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
20a20 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20  sulting pointer 
20a30 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54  into pzBuf..** T
20a40 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
20a50 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73  ned in pzBuf mus
20a60 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73  t be freed via s
20a70 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
20a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20a90 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
20aa0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
20ab0 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20  har **pzBuf){.  
20ac0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
20ad0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
20ae0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
20af0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
20b00 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
20b10 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
20b20 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
20b30 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
20b40 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74  nPre = sqlite3St
20b50 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
20b60 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
20b70 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75  .  int nMax, nBu
20b80 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20  f, nDir, nLen;. 
20b90 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
20ba0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
20bb0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
20bc0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
20bd0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
20be0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
20bf0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
20c00 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
20c10 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
20c20 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
20c30 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
20c40 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
20c50 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
20c60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
20c70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20c80 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
20c90 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
20ca0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
20cb0 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66  file.  ** name f
20cc0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
20cd0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20   file.  If this 
20ce0 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74  fails, we cannot
20cf0 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a   continue..  */.
20d00 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d    nMax = pVfs->m
20d10 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20  xPathname; nBuf 
20d20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42  = nMax + 2;.  zB
20d30 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  uf = sqlite3Mall
20d40 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a  ocZero( nBuf );.
20d50 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20    if( !zBuf ){. 
20d60 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
20d70 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
20d80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20d90 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
20da0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
20db0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
20dc0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
20dd0 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61  ffective tempora
20de0 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46  ry directory.  F
20df0 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f  irst, check if o
20e00 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  ne.  ** has been
20e10 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20   explicitly set 
20e20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
20e30 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75  on; otherwise, u
20e40 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20  se the one.  ** 
20e50 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
20e60 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
20e70 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20  em..  */.  nDir 
20e80 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b  = nMax - (nPre +
20e90 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20   15);.  assert( 
20ea0 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  nDir>0 );.  if( 
20eb0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
20ec0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
20ed0 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69  t nDirLen = sqli
20ee0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
20ef0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
20f00 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  ry);.    if( nDi
20f10 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  rLen>0 ){.      
20f20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70  if( !winIsDirSep
20f30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
20f40 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d  rectory[nDirLen-
20f50 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  1]) ){.        n
20f60 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  DirLen++;.      
20f70 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72  }.      if( nDir
20f80 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20  Len>nDir ){.    
20f90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20fa0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
20fb0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
20fc0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
20fd0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
20fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
20ff0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
21000 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
21010 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b  tTempname1", 0);
21020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
21030 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21040 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
21050 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
21060 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
21070 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
21080 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
21090 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
210a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
210b0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
210c0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51  0, /* getenv("SQ
210d0 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f  LITE_TMPDIR") */
210e0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
210f0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a  tenv("TMPDIR") *
21100 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
21110 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a  etenv("TMP") */.
21120 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21130 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20  env("TEMP") */. 
21140 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21150 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
21160 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61  ) */.       "/va
21170 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
21180 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
21190 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20    "/tmp",.      
211a0 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20   ".",.       0  
211b0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
211c0 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20  rminator */.    
211d0 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  };.    unsigned 
211e0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
211f0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
21200 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ..    if( !azDir
21210 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
21220 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
21230 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  E_TMPDIR");.    
21240 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
21250 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
21260 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
21270 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32     if( !azDirs[2
21280 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
21290 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20  getenv("TMP");. 
212a0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33     if( !azDirs[3
212b0 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20  ] ) azDirs[3] = 
212c0 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a  getenv("TEMP");.
212d0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
212e0 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d  4] ) azDirs[4] =
212f0 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
21300 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  FILE");.    for(
21310 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
21320 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
21330 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
21340 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
21350 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
21360 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  ed;.      if( zD
21370 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
21380 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
21390 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  e path starts wi
213a0 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
213b0 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  r followed by th
213c0 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a  e colon.      **
213d0 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75   character, assu
213e0 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  me it is already
213f0 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
21400 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c  path; otherwise,
21410 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73  .      ** it mus
21420 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
21430 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  o a native Win32
21440 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79   path via the Cy
21450 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a  gwin API.      *
21460 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67  * prior to using
21470 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
21480 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69      if( winIsDri
21490 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
214a0 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
214b0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
214c0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
214d0 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b  8Filename(zDir);
214e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
214f0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
21500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21510 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21520 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21530 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21540 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21550 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
21560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21570 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
21580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21590 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
215a0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
215b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
215c0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
215d0 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
215e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
215f0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
21610 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
21620 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21630 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
21640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21650 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
21660 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
21670 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
21680 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
21690 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
216a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
216b0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
216c0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
216d0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
216e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
216f0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
21700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
21710 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
21720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21730 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
21740 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h(.             
21750 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43     osIsNT() ? CC
21760 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
21770 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
21780 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20  WIN_A, zDir,.   
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
217a0 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29  nverted, nMax+1)
217b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
217c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
217d0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
217e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
217f0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
21800 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
21810 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
21820 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
21830 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  TH\n"));.       
21840 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
21850 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21860 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  RR_CONVPATH, (DW
21870 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)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 22 77 69 6e 47 65 74 54          "winGetT
218a0 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29  empname2", zDir)
218b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
218c0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
218d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
218e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
218f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
21900 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74  now the candidat
21910 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73  e directory exis
21920 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ts and should.  
21930 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73          ** be us
21940 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65  ed.  However, we
21950 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e   may need to con
21960 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  vert the string 
21970 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20  containing.     
21980 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65       ** its name
21990 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65   into UTF-8 (i.e
219a0 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31  . if it is UTF-1
219b0 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20  6 right now)..  
219c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
219d0 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
219e0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
219f0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e  tf8Filename(zCon
21a00 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21a10 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
21a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21a30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21a40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
21a50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21a60 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21a70 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21a80 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21a90 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21aa0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
21ab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21ac0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
21ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ae0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21af0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
21b00 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
21b10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21b20 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
21b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21b40 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21b50 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
21b60 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21b70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21b80 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
21b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21ba0 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
21bb0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
21bc0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
21bd0 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e    else if( osIsN
21be0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
21bf0 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57  *zMulti;.    LPW
21c00 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20  STR zWidePath = 
21c10 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21c20 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57  o( nMax*sizeof(W
21c30 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28  CHAR) );.    if(
21c40 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20   !zWidePath ){. 
21c50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21c60 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
21c70 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21c80 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21c90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21cb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21cc0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
21cd0 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  ( osGetTempPathW
21ce0 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68  (nMax, zWidePath
21cf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
21d00 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
21d10 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
21d20 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21d30 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21d40 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21d50 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
21d60 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
21d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
21d80 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21d90 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
21da0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
21db0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21dd0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
21de0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
21df0 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63  zMulti = winUnic
21e00 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
21e10 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
21e20 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
21e30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21e40 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
21e50 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
21e60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75  sqlite3_free(zMu
21e70 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
21e80 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
21e90 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  th);.    }else{.
21ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21eb0 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
21ec0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21ed0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
21ee0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21ef0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21f00 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21f10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21f20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21f30 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  EM;.    }.  }.#i
21f40 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
21f50 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
21f60 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
21f70 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  f8;.    char *zM
21f80 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65  bcsPath = sqlite
21f90 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
21fa0 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  x );.    if( !zM
21fb0 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20  bcsPath ){.     
21fc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21fd0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
21fe0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
21ff0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22000 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22010 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22020 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
22040 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61  GetTempPathA(nMa
22050 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30  x, zMbcsPath)==0
22060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22070 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22080 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22090 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
220a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
220b0 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
220c0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
220d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
220e0 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c  ERR_GETTEMPPATH,
220f0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
22100 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
22110 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
22120 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30  GetTempname3", 0
22130 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  );.    }.    zUt
22140 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
22150 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
22160 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
22170 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
22180 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22190 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
221a0 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
221b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
221c0 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
221d0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
221e0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
221f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22200 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22220 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
22230 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22240 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
22250 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
22260 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
22270 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  SI */.#endif /* 
22280 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
22290 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   */..  /*.  ** C
222a0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
222b0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
222c0 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77  directory ends w
222d0 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ith an appropria
222e0 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f  te.  ** separato
222f0 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  r.  If it does n
22300 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ot and there is 
22310 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65  not enough space
22320 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a   left to add.  *
22330 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a  * one, fail..  *
22340 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65  /.  if( !winMake
22350 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72  EndInDirSep(nDir
22360 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20  +1, zBuf) ){.   
22370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22380 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  uf);.    OSTRACE
22390 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
223a0 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
223b0 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
223c0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
223d0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
223e0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22  winGetTempname4"
223f0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  , 0);.  }..  /*.
22400 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20    ** Check that 
22410 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
22420 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
22430 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
22440 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
22450 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ame in the follo
22460 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  wing format:.  *
22470 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f  *.  **   "<tempo
22480 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f  rary_directory>/
22490 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58  etilqs_XXXXXXXXX
224a0 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a  XXXXXX\0\0".  **
224b0 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65  .  ** If not, re
224c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
224d0 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31  R.  The number 1
224e0 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69  7 is used here i
224f0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
22500 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
22510 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
22520 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72  e 15 character r
22530 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64  andom suffix and
22540 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72   the.  ** two tr
22550 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61  ailing NUL chara
22560 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61  cters.  The fina
22570 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  l directory sepa
22580 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  rator character.
22590 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
225a0 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73   added if it was
225b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65   not already pre
225c0 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65  sent..  */.  nLe
225d0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
225e0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28  n30(zBuf);.  if(
225f0 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20   (nLen + nPre + 
22600 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20  17) > nBuf ){.  
22610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22620 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
22630 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22640 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
22650 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
22660 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22670 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
22680 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35  "winGetTempname5
22690 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ", 0);.  }..  sq
226a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
226b0 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75  Buf-16-nLen, zBu
226c0 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54  f+nLen, SQLITE_T
226d0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
226e0 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  ;..  j = sqlite3
226f0 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
22700 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
22710 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
22720 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
22730 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
22740 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
22750 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
22760 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
22770 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
22780 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
22790 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
227a0 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
227b0 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a   *pzBuf = zBuf;.
227c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
227d0 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d  P-FILENAME name=
227e0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %s, rc=SQLITE_OK
227f0 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
22800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22820 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
22830 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
22840 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
22850 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
22860 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
22870 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
22880 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
22890 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
228a0 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
228b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
228c0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
228d0 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
228e0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
228f0 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  d){.  DWORD attr
22900 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
22910 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
22920 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  o;..  if( osIsNT
22930 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
22940 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
22950 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
22960 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
22970 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
22980 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
22990 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
229a0 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
229b0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
229c0 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
229d0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  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 47 65 74 46 69 6c 65           GetFile
22a00 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
22a10 20 20 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 26 73 41               &sA
22a30 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
22a40 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
22a50 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
22a60 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
22a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22a80 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
22a90 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
22aa0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
22ab0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
22ac0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
22ad0 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
22ae0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
22af0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
22b00 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
22b10 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
22b20 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
22b30 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
22b40 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
22b50 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
22b60 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
22b70 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
22b80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22b90 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
22ba0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
22bb0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
22bc0 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74   get maximum pat
22bd0 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f  h name length */
22be0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22bf0 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
22c00 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
22c10 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
22c20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
22c30 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22c40 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
22c50 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
22c60 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
22c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22c80 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
22c90 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
22ca0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
22cb0 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
22cc0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
22cd0 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
22ce0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
22cf0 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
22d00 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
22d10 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
22d20 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
22d30 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
22d40 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
22d50 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
22d60 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
22d70 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
22d80 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
22d90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
22da0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
22db0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22dd0 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
22de0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
22df0 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
22e00 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
22e10 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
22e20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
22e30 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
22e40 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
22e50 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
22e60 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
22e70 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
22e80 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
22e90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
22ea0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
22eb0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
22ec0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
22ed0 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20   char *zTmpname 
22ee0 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70  = 0; /* For temp
22ef0 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20  orary filename, 
22f00 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  if necessary. */
22f10 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
22f20 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
22f30 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
22f40 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
22f50 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
22f60 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
22f70 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
22f80 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
22f90 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
22fa0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
22fb0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
22fc0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
22fd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
22fe0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
22ff0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
23000 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
23010 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
23020 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
23030 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
23040 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
23050 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
23060 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
23070 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23080 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
23090 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
230a0 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
230b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
230c0 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
230d0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
230e0 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
230f0 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
23100 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
23110 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
23120 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
23130 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23140 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
23150 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
23160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
23170 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
23180 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
23190 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
231a0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
231b0 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
231c0 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
231d0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
231e0 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
231f0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
23200 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
23210 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
23220 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
23230 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
23240 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
23250 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
23260 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
23270 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
23280 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
23290 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
232a0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
232b0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
232c0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
232d0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
232e0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
232f0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
23300 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
23310 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
23320 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
23330 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
23340 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
23350 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
23360 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
23370 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
23380 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
23390 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
233a0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
233b0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
233c0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
233d0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
233e0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
233f0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
23400 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
23410 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
23420 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
23430 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
23440 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
23450 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
23460 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
23470 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
23480 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
23490 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
234a0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
234b0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
234c0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
234d0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
234e0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
234f0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
23500 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23510 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
23520 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23530 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
23540 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
23550 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
23560 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
23570 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
23580 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
23590 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
235a0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
235b0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
235c0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
235d0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
235e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
235f0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
23600 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
23610 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
23620 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23630 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
23640 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23650 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
23660 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
23670 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23680 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
23690 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
236a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
236b0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
236c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
236d0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
236e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
236f0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
23700 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
23710 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
23720 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
23730 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
23740 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
23750 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
23760 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
23770 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
23780 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65  e && !sqlite3_te
23790 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
237a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
237b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
237c0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
237d0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
237e0 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
237f0 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
23800 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
23810 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
23820 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
23830 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
23840 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
23850 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
23860 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
23870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
23880 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
23890 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
238a0 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
238b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
238c0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
238d0 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
238e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
238f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
23900 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
23910 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
23920 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
23930 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
23940 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23950 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
23960 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
23970 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
23980 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
23990 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
239a0 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
239b0 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
239c0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
239d0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
239e0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
239f0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
23a00 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
23a10 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
23a20 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
23a30 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
23a40 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
23a50 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
23a60 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
23a70 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
23a80 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
23a90 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
23aa0 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
23ab0 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
23ac0 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
23ad0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
23ae0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
23af0 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
23b00 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
23b10 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
23b20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
23b30 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
23b40 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23b50 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
23b60 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
23b70 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23b80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23b90 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
23ba0 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
23bb0 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
23bc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
23bd0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
23be0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
23bf0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
23c00 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
23c10 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
23c20 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
23c30 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23c40 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
23c50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
23c60 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
23c70 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
23c80 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
23c90 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
23ca0 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
23cb0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
23cc0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
23cd0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
23ce0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
23cf0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
23d00 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
23d10 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
23d20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
23d30 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
23d40 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
23d50 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
23d60 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
23d70 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
23d80 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
23d90 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
23da0 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
23db0 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
23dc0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
23dd0 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
23de0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
23df0 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
23e00 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
23e10 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
23e20 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
23e30 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
23e40 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
23e50 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
23e60 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
23e70 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
23e80 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
23e90 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
23ea0 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
23eb0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
23ec0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
23ed0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
23ee0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
23ef0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
23f00 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
23f10 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
23f20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
23f30 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
23f40 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
23f50 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
23f60 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
23f70 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
23f80 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
23f90 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
23fa0 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
23fb0 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
23fc0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
23fd0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
23fe0 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
24010 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_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 7c 20 46               | F
24040 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
24050 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
24060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
24070 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24080 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
24090 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
240a0 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
240b0 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
240c0 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
240d0 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
240e0 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
240f0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
24100 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
24110 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
24120 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
24130 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
24140 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
24150 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24160 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
24170 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
24180 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24190 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
241a0 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
241b0 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
241c0 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
241d0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
241e0 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
241f0 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
24200 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
24210 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
24220 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
24230 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
24240 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
24250 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
24260 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
24270 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
24280 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
24290 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
242a0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
242b0 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
242c0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
242d0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
242e0 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
242f0 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
24300 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
24310 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
24320 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
24330 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
24340 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
24350 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
24360 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
24370 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
24380 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
24390 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243b0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
243c0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
243f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24410 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
24420 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
24450 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
24460 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24470 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
244a0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
244b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
244c0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
244d0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
244e0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
244f0 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
24500 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)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 64 77 44 65              dwDe
24530 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
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 64 77 53 68 61             dwSha
24560 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, 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 64 77 43 72              dwCr
24590 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
245a0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
245d0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
24600 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
24610 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
24640 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
24650 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
24660 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
24670 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
24680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
24690 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
246a0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
246b0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
246c0 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
246d0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
24700 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
24730 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , 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 64 77 43 72 65 61 74 69 6f 6e        dwCreation
24760 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
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 64 77 46 6c 61             dwFla
24790 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
247a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
247c0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
247d0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
247e0 20 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 77 69 6e               win
24800 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
24810 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24830 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
24840 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e    }.#endif.  win
24850 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  LogIoerr(cnt);..
24860 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24870 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
24880 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
24890 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
248a0 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
248b0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
248c0 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
248d0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
248e0 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
248f0 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
24900 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24910 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
24920 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
24930 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
24940 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
24950 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
24960 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
24970 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
24980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24990 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
249a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
249b0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
249c0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
249d0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
249e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
249f0 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
24a00 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
24a10 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
24a20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
24a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24a40 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
24a50 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
24a60 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24a70 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
24a80 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
24a90 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
24aa0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
24ab0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
24ac0 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
24ad0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
24ae0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
24af0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
24b00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24b10 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
24b20 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
24b30 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
24b40 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
24b50 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
24b60 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
24b70 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
24b80 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
24b90 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
24ba0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
24bb0 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
24bc0 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
24bd0 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
24be0 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
24bf0 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
24c00 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
24c10 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24c20 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
24c30 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
24c40 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
24c50 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
24c60 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
24c70 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
24c80 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
24c90 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
24ca0 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
24cb0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
24cc0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
24cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24ce0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24d00 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
24d10 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d   OSTRACE(("OPEN-
24d20 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c  CE-LOCK name=%s,
24d30 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65   rc=%s\n", zName
24d40 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
24d50 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75  (rc)));.    retu
24d60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
24d70 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
24d80 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
24d90 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
24da0 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
24db0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
24dc0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24dd0 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
24de0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
24df0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
24e00 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
24e10 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
24e20 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
24e30 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
24e40 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
24e50 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
24e60 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
24e70 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
24e80 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
24e90 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
24ea0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
24eb0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
24ec0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
24ed0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
24ee0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
24ef0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
24f00 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
24f10 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
24f20 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
24f30 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
24f40 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
24f50 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
24f60 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
24f70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
24f80 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
24f90 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
24fa0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
24fb0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
24fc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
24fd0 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
24fe0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
24ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25000 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
25010 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
25020 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
25030 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
25040 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
25050 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
25060 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
25070 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
25080 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
25090 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
250a0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
250b0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
250c0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
250d0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
250e0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
250f0 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
25100 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
25110 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
25120 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
25130 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
25140 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
25150 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
25160 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
25170 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
25180 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
25190 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
251a0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
251b0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
251c0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
251d0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
251e0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
251f0 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
25200 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
25210 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
25220 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
25230 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
25240 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
25250 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
25260 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
25270 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
25280 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25290 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
252a0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
252d0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
252e0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
252f0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
25300 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
25310 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
25320 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
25330 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
25340 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
25350 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
25360 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
25370 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
25380 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
25390 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
253a0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
253b0 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
253c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
253d0 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
253e0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
253f0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
25400 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
25410 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
25420 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
25430 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
25440 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
25450 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
25460 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
25470 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25480 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
25490 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
254a0 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
254b0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
254c0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
254d0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
254e0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
254f0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
25500 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
25510 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
25520 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
25530 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
25540 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
25550 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
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 26 73 41               &sA
25580 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
25590 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
255a0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
255b0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
255c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74  se{.        last
255d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
255e0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
255f0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
25600 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
25610 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
25620 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
25630 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
25640 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
25650 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25660 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
25670 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
25680 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
25690 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
256a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
256b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
256c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
256d0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
256e0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
256f0 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
25700 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
25710 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
25720 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
25730 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
25740 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
25750 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
25760 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
25770 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
25780 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
25790 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
257a0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
257b0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
257c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
257d0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
257e0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
257f0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
25800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25810 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
25820 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
25830 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25840 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
25850 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
25860 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
25870 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25880 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
25890 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
258a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
258b0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
258c0 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
258d0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
258e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
258f0 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
25900 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
25910 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25920 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
25930 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
25940 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
25950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25960 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
25970 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
25980 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25990 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
259a0 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
259b0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
259c0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
259d0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
259e0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
259f0 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
25a00 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
25a10 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
25a20 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
25a30 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
25a40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
25a50 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
25a60 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
25a70 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
25a80 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
25a90 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
25aa0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
25ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25ac0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
25ad0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
25ae0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
25af0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25b00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25b10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
25b30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25b40 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
25b50 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
25b60 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
25b70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25b80 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
25b90 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
25ba0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25bb0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
25bc0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
25bd0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
25be0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
25bf0 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
25c00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
25c20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
25c30 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
25c40 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
25c50 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
25c60 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
25c70 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
25c80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25c90 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
25ca0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
25cb0 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
25cc0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
25cd0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
25ce0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
25cf0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
25d00 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
25d10 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
25d20 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
25d30 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
25d40 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
25d50 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25d60 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
25d70 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
25d80 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
25d90 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
25da0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
25db0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25dc0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
25dd0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
25de0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
25df0 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
25e00 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
25e10 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
25e20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
25e30 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
25e40 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
25e50 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
25e60 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
25e70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e90 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
25ea0 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
25eb0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
25ec0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
25ed0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
25ee0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
25ef0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
25f00 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
25f10 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
25f20 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
25f30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25f40 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
25f50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
25f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25f70 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f  R_ACCESS; );.  O
25f80 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
25f90 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25  name=%s, flags=%
25fa0 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  x, pResOut=%p\n"
25fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
25fc0 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
25fd0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f  ResOut));..  zCo
25fe0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
25ff0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
26000 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
26010 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
26020 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
26030 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
26040 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
26050 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
26060 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
26070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26080 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
26090 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
260a0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
260b0 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
260c0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
260d0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
260e0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
260f0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
26100 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
26110 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
26120 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
26130 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
26140 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
26170 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20  foStandard, .   
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 26 73 41 74 74 72            &sAttr
261a0 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
261b0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
261c0 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
261d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
261e0 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
261f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
26200 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
26210 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
26220 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
26230 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
26240 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
26250 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
26260 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
26270 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
26280 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
26290 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
262a0 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
262b0 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
262c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
262d0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
262e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
262f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26300 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
26310 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
26320 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
26330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26340 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
26350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
26360 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
26370 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
26380 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
26390 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
263a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
263b0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
263c0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
263d0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
263e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
263f0 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
26400 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 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 7a 46 69 6c 65 6e 61 6d          zFilenam
26430 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
26440 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
26450 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26460 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
26470 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
26480 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
26490 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
264a0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
264b0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
264c0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
264d0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
264e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
264f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
26500 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
26510 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
26520 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
26530 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
26540 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
26550 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
26560 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
26570 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
26580 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
26590 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
265a0 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
265b0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
265c0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
265d0 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
265e0 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
265f0 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
26600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26610 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
26620 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
26630 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
26640 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
26650 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
26660 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
26670 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
26680 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
26690 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
266a0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
266b0 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
266c0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
266d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
266e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
266f0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
26700 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
26710 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
26720 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a   drive letter.**
26730 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
26740 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a  olon character..
26750 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
26760 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
26770 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74  ndColon(.  const
26780 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
26790 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73  .){.  return ( s
267a0 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
267b0 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
267c0 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
267d0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
267e0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
267f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
26800 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
26810 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
26820 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
26830 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
26840 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
26850 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
26860 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
26870 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
26880 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
26890 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
268a0 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
268b0 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
268c0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
268d0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
268e0 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
268f0 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
26900 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
26910 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
26920 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
26930 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
26940 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
26950 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
26960 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
26970 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
26980 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
26990 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
269a0 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
269b0 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
269c0 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
269d0 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
269e0 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
269f0 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
26a00 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
26a10 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
26a20 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
26a30 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
26a40 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
26a50 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
26a60 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
26a70 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
26a80 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
26a90 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
26aa0 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
26ab0 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
26ac0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  m..  */.  if ( w
26ad0 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68  inIsDirSep(zPath
26ae0 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
26af0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
26b00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
26b10 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
26b20 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
26b30 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
26b40 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
26b50 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
26b60 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
26b70 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
26b80 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
26b90 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
26ba0 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
26bb0 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
26bc0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
26bd0 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
26be0 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
26bf0 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
26c00 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
26c10 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
26c20 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20  olon(zPathname) 
26c30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
26c40 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
26c50 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
26c60 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
26c70 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
26c80 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
26c90 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
26ca0 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
26cb0 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
26cc0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
26cd0 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
26ce0 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
26cf0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
26d00 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
26d10 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
26d20 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
26d30 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
26d40 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
26d50 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
26d60 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
26d70 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
26d80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
26d90 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
26da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
26db0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
26dc0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
26dd0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
26de0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
26df0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
26e00 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
26e10 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
26e20 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
26e30 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
26e40 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e60 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
26e70 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
26e80 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
26eb0 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
26ec0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
26ed0 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
26ee0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
26ef0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
26f00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f10 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
26f20 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
26f30 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
26f40 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
26f50 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
26f60 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
26f70 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
26f80 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
26f90 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
26fa0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
26fb0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
26fc0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
26fd0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
26fe0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
26ff0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
27000 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
27010 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
27020 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
27030 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
27040 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
27050 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
27060 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
27070 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
27080 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
27090 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
270a0 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
270b0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
270c0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
270d0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
270e0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
270f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27100 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
27110 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
27120 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
27130 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20      (osIsNT() ? 
27140 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
27150 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
27160 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20  O_WIN_A) |.     
27170 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54         CCP_RELAT
27180 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  IVE, zRelative, 
27190 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61  zOut, pVfs->mxPa
271a0 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20  thname+1)<0 ){. 
271b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
271c0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
271d0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
271e0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
271f0 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  N_CONVPATH, (DWO
27200 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
27230 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame1", zRelative
27240 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27250 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
27260 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
27270 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29  f8Filename(zOut)
27280 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74  ;.      if( !zUt
27290 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  f8 ){.        sq
272a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
272b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
272c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
272d0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
272e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
272f0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
27300 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
27310 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
27320 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27340 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
27350 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
27360 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
27370 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
27380 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
27390 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
273a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
273b0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
273c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
273d0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
273e0 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
273f0 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
27400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27410 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
27420 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
27430 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
27440 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
27450 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
27460 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
27470 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20  _TO_WIN_A),.    
27480 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76          zRelativ
27490 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
274a0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
274b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
274c0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
274d0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
274e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
274f0 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
27500 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 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 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
27530 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74  thname2", zRelat
27540 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
27550 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
27560 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
27570 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
27580 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
27590 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
275a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
275b0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
275c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
275d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
275e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
275f0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
27600 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27610 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
27620 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
27630 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
27640 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
27650 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
27660 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
27680 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  dif..#if (SQLITE
27690 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
276a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26  ITE_OS_WINRT) &&
276b0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
276c0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
276d0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
276e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
276f0 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
27700 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
27710 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
27720 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
27730 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54  d. */.  /* WinRT
27740 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63   has no way to c
27750 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76  onvert a relativ
27760 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73  e path to an abs
27770 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  olute one. */.  
27780 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
27790 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
277a0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
277b0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
277c0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
277d0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
277e0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
277f0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
27800 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
27810 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
27820 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
27830 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
27840 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
27850 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
27860 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
27870 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
27880 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
27890 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
278a0 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
278b0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
278c0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
278d0 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
278e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
278f0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
27900 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
27910 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
27920 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27940 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
27950 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
27960 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65  zRelative);.  }e
27970 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
27980 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
27990 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
279a0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
279b0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
279c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
279d0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
279e0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
279f0 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
27a00 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
27a10 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
27a20 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b  ).  DWORD nByte;
27a30 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
27a40 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
27a50 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
27a60 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
27a70 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
27a80 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
27a90 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
27aa0 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
27ab0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
27ac0 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
27ad0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
27ae0 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
27af0 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c  ' && winIsDriveL
27b00 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52  etterAndColon(zR
27b10 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20  elative+1) ){.  
27b20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
27b30 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64   }..  /* It's od
27b40 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
27b50 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
27b60 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
27b70 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
27b80 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
27b90 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
27ba0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
27bb0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
27bc0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
27bd0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
27be0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
27bf0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
27c00 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
27c10 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
27c20 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
27c30 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
27c40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
27c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27c60 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  OR );.  if ( sql
27c70 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
27c80 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
27c90 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
27ca0 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
27cb0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
27cc0 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
27cd0 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
27ce0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
27cf0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
27d00 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
27d10 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
27d20 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
27d30 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
27d40 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
27d50 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
27d60 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
27d70 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
27d80 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
27d90 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
27da0 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
27db0 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
27dc0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
27dd0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
27de0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
27df0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
27e00 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
27e30 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
27e40 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rSep(), zRelativ
27e50 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
27e60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
27e70 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
27e80 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
27e90 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
27ea0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
27eb0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
27ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27ed0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
27ee0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
27ef0 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
27f00 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
27f10 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
27f20 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
27f30 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
27f40 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
27f50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27f60 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
27f70 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
27f80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27f90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
27fa0 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
27fb0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
27fe0 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me1", zRelative)
27ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
28000 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
28010 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
28020 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
28030 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
28040 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
28050 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28060 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28070 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
28080 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28090 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
280a0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
280b0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
280c0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
280d0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
280e0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
280f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28100 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28110 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
28120 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
28130 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
28140 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
28150 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
28160 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
28170 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28190 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
281a0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
281b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
281c0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
281d0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  );.    zOut = wi
281e0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
281f0 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
28200 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
28210 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
28220 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
28230 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
28240 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
28250 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
28260 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
28270 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
28280 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
28290 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
282a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
282b0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
282c0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
282d0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
282e0 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
282f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
28320 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c  Pathname3", zRel
28330 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
28340 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
28350 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
28360 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
28370 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
28380 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
28390 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
283a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
283b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
283c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
283d0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
283e0 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
283f0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
28400 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
28410 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
28420 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
28430 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
28440 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28450 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
28460 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
28470 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
28480 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
28490 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
284a0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
284b0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
284e0 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame4", zRelative
284f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
28500 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28510 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
28520 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
28530 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
28540 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
28550 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28560 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
28570 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
28580 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
28590 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
285a0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
285b0 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
285c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
285d0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
285e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
285f0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
28600 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28610 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  EM;.  }.#endif.}
28620 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28630 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
28640 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
28650 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
28660 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
28670 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
28680 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
28690 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
286a0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
286b0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
286c0 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  brary..*/./*.** 
286d0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
286e0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
286f0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
28700 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
28710 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
28720 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
28730 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
28740 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
28750 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
28760 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
28770 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
28780 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
28790 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
287a0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
287b0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
287c0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
287d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
287e0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
287f0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
28800 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
28810 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
28820 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
28830 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
28840 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
28850 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
28860 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
28870 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
28880 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
28890 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
288a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
288b0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
288c0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
288d0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
288e0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
288f0 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
28900 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
28910 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
28920 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28930 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
28940 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
28950 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
28960 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
28970 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
28980 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
28990 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
289a0 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
289b0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
289c0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
289d0 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
289e0 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
289f0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
28a00 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73  fs,void *pH,cons
28a10 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
28a20 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  oid){.  UNUSED_P
28a30 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
28a40 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
28a50 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f  )(void))osGetPro
28a60 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c  cAddressA((HANDL
28a70 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  E)pH, zSym);.}.s
28a80 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
28a90 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
28aa0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
28ab0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
28ac0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
28ad0 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61  );.  osFreeLibra
28ae0 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
28af0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
28b00 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
28b10 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
28b20 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
28b30 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
28b40 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
28b50 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
28b60 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
28b70 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
28b80 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
28b90 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
28ba0 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
28bb0 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
28bc0 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
28bd0 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
28be0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
28bf0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
28c00 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
28c10 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55  int n = 0;.  UNU
28c20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
28c30 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  fs);.#if defined
28c40 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
28c50 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
28c60 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
28c70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
28c80 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
28c90 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
28ca0 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
28cb0 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
28cc0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
28cd0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
28ce0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
28cf0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
28d00 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
28d10 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
28d20 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
28d30 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
28d40 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
28d50 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
28d60 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
28d70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  id));.    n += s
28d80 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a  izeof(pid);.  }.
28d90 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
28da0 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  NRT.  if( sizeof
28db0 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75  (ULONGLONG)<=nBu
28dc0 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47  f-n ){.    ULONG
28dd0 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74  LONG cnt = osGet
28de0 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20  TickCount64();. 
28df0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
28e00 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
28e10 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
28e20 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
28e30 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  }.#else.  if( si
28e40 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
28e50 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
28e60 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
28e70 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
28e80 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
28e90 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
28ea0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
28eb0 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  f(cnt);.  }.#end
28ec0 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  if.  if( sizeof(
28ed0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
28ee0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
28ef0 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
28f00 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
28f10 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
28f20 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
28f30 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
28f40 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
28f50 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
28f60 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
28f70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
28f80 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
28f90 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
28fa0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
28fb0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
28fc0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
28fd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28fe0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
28ff0 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
29000 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
29010 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
29020 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29030 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
29040 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
29050 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
29060 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
29070 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
29080 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
29090 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
290a0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
290b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
290c0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
290d0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
290e0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
290f0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
29100 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
29110 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
29120 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
29130 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
29140 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
29150 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
29160 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
29170 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
29180 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
29190 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
291a0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
291b0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
291c0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
291d0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
291e0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
291f0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
29200 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
29210 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
29220 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
29230 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
29240 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
29250 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
29260 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
29270 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
29280 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
29290 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
292a0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
292b0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
292c0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
292d0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
292e0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
292f0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
29300 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
29310 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
29320 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
29330 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
29340 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
29350 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
29360 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
29370 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
29380 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
29390 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
293a0 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
293b0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
293c0 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
293d0 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
293e0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
293f0 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
29400 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
29410 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d   .  */.  FILETIM
29420 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
29430 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
29440 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
29450 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
29460 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
29470 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
29480 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
29490 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
294a0 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
294b0 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
294c0 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
294d0 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
294e0 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
294f0 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
29500 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
29510 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
29520 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
29530 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20  x32BitValue = . 
29540 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
29550 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
29560 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29570 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20  2000000000 +.   
29580 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
29590 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69  4)294967296;..#i
295a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
295b0 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
295c0 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74  ime;.  osGetSyst
295d0 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
295e0 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d   /* if SystemTim
295f0 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61  eToFileTime() fa
29600 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ils, it returns 
29610 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21  zero. */.  if (!
29620 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
29630 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
29640 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  )){.    return S
29650 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
29660 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
29670 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
29680 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
29690 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69  f..  *piNow = wi
296a0 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b  nFiletimeEpoch +
296b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28  .            (((
296c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
296d0 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
296e0 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29  )*max32BitValue)
296f0 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
29700 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
29710 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
29720 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
29730 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
29740 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
29750 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
29760 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
29770 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
29780 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
29790 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
297a0 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
297b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
297c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
297d0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
297e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
297f0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
29800 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
29810 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
29820 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
29830 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
29840 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
29850 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
29860 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
29870 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
29880 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29890 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
298a0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
298b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
298c0 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
298d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
298e0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
298f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
29900 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
29910 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
29920 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
29930 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
29940 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
29950 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
29960 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29970 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
29980 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
29990 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
299a0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
299b0 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
299c0 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
299d0 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
299e0 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
299f0 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
29a00 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
29a10 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
29a20 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
29a30 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
29a40 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
29a50 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
29a60 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
29a70 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
29a80 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
29a90 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
29aa0 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
29ab0 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
29ac0 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
29ad0 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
29ae0 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
29af0 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
29b00 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
29b10 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
29b20 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
29b30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
29b40 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29b50 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
29b60 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
29b70 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
29b80 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
29b90 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
29ba0 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
29bb0 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
29bc0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
29bd0 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
29be0 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
29bf0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
29c00 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
29c10 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
29c20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
29c30 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
29c40 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
29c50 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
29c60 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
29c70 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
29c80 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
29c90 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
29ca0 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
29cb0 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
29cc0 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
29cd0 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
29ce0 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
29cf0 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
29d00 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
29d10 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
29d20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
29d30 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
29d40 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
29d50 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
29d60 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
29d70 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
29d80 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
29d90 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
29da0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
29db0 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
29dc0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
29dd0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
29de0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
29df0 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
29e00 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
29e10 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
29e20 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
29e30 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
29e40 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
29e50 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
29e60 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
29e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29e80 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
29e90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29ea0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29eb0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
29ec0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29ed0 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65  ;.  return winGe
29ee0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
29ef0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
29f00 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
29f10 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
29f20 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
29f30 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
29f40 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
29f50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29f60 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
29f70 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
29f80 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
29f90 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
29fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
29fb0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
29fc0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
29fd0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
29fe0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
29ff0 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2a000 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2a010 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2a020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2a030 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2a040 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
2a050 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2a060 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2a070 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2a080 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a0a0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2a0b0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2a0c0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2a0d0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2a0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2a0f0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2a100 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2a110 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2a120 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2a130 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2a140 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2a150 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2a160 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2a170 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2a180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a190 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2a1a0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2a1b0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2a1c0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2a1d0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
2a1e0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2a1f0 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2a200 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2a210 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2a220 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
2a230 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
2a240 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
2a250 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
2a260 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2a270 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2a280 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
2a290 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2a2a0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2a2b0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
2a2c0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2a2d0 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2a2e0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2a2f0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2a300 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2a310 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2a320 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
2a330 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2a340 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2a350 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2a360 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
2a370 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2a3a0 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2a3b0 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2a3c0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2a3d0 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
2a3e0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2a3f0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2a420 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
2a430 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  h",    /* zName 
2a440 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2a450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2a460 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2a470 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2a480 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2a490 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2a4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2a4b0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2a4c0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2a4d0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2a4e0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2a4f0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2a500 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2a510 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2a520 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2a530 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2a540 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2a550 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2a560 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2a570 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2a580 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2a590 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2a5a0 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2a5b0 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2a5c0 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2a5d0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a5f0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2a600 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2a610 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2a620 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2a630 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2a640 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2a650 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2a660 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2a670 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2a680 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2a690 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2a6a0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2a6b0 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2a6c0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2a6d0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2a6e0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2a6f0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2a700 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2a710 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  };.#endif..  /* 
2a720 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
2a730 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
2a740 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
2a750 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
2a760 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
2a770 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
2a780 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
2a790 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2a7a0 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 36  ze(aSyscall)==76
2a7b0 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65   );..  /* get me
2a7c0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
2a7d0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
2a7e0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
2a7f0 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
2a800 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
2a810 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
2a820 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74  WINRT.  osGetNat
2a830 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  iveSystemInfo(&w
2a840 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  inSysInfo);.#els
2a850 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  e.  osGetSystemI
2a860 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
2a870 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
2a880 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2a890 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
2a8a0 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73  arity>0 );.  ass
2a8b0 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2a8c0 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a  dwPageSize>0 );.
2a8d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2a8e0 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
2a8f0 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65   1);..#if define
2a900 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2a910 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74  AS_WIDE).  sqlit
2a920 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2a930 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c  &winLongPathVfs,
2a940 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72   0);.#endif..  r
2a950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a960 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
2a970 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
2a980 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2a990 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
2a9a0 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  bj!=NULL ){.    
2a9b0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
2a9c0 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
2a9d0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
2a9e0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2a9f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2aa00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2aa10 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.