/ Hex Artifact Content
Login

Artifact 1b21af72c5fa6f9e519a5fcab33e80d182b1aedb:


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 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
18b70 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74  ic int winShmMut
18b80 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
18b90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
18ba0 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
18bb0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
18bc0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
18bd0 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
18be0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  dif../*.** Objec
18bf0 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
18c00 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  ent a single fil
18c10 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61  e opened and mma
18c20 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a  pped to provide.
18c30 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ** shared memory
18c40 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .  When multiple
18c50 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
18c60 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a  erence the same.
18c70 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20  ** log-summary, 
18c80 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
18c90 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20  its own winFile 
18ca0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
18cb0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
18cc0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
18cd0 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
18ce0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
18cf0 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
18d00 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
18d10 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
18d20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77  process..**.** w
18d30 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
18d40 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
18d50 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
18d60 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
18d70 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
18d80 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
18d90 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
18da0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
18db0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20        nRef.**   
18dc0 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20     pNext .**.** 
18dd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
18de0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
18df0 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
18e00 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
18e10 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
18e20 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
18e30 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77  e.**.** Either w
18e40 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  inShmNode.mutex 
18e50 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
18e60 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
18e70 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d  =0 and.** winShm
18e80 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
18e90 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
18ea0 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
18eb0 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
18ec0 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
18ed0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77  ..**.*/.struct w
18ee0 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71  inShmNode {.  sq
18ef0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
18f00 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
18f10 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
18f20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
18f30 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
18f40 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18f50 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
18f60 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20   winFile hFile; 
18f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18f80 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
18f90 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e  winOpen */..  in
18fa0 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
18fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
18fc0 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
18fd0 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
18fe0 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  nt nRegion;     
18ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
19000 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
19010 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ion */.  struct 
19020 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20  ShmRegion {.    
19030 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
19040 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
19050 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65   handle from Cre
19060 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a  ateFileMapping *
19070 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70  /.    void *pMap
19080 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a  ;.  } *aRegion;.
19090 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
190a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
190b0 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
190c0 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
190d0 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  I/O error */..  
190e0 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
190f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19100 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f  mber of winShm o
19110 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
19120 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
19130 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
19140 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77          /* All w
19150 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
19160 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
19170 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
19180 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f  pNext;         /
19190 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f  * Next in list o
191a0 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
191b0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64   objects */.#ifd
191c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
191d0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
191f0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77  Next available w
19200 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  inShm.id value *
19210 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
19220 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61  ** A global arra
19230 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  y of all winShmN
19240 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a  ode objects..**.
19250 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74  ** The winShmMut
19260 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
19270 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64   true while read
19280 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
19290 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  his list..*/.sta
192a0 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  tic winShmNode *
192b0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
192c0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63   0;../*.** Struc
192d0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
192e0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
192f0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
19300 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
19310 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
19320 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
19330 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19340 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
19350 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
19360 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
19370 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
19380 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
19390 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69  ter:.**.**    wi
193a0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a  nShm.pShmNode.**
193b0 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a      winShm.id.**
193c0 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
193d0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
193e0 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d  ite.  The winShm
193f0 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  .pShmNode->mutex
19400 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
19410 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
19420 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
19430 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
19440 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e  t winShm {.  win
19450 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
19460 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75  e;      /* The u
19470 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d  nderlying winShm
19480 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
19490 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20   winShm *pNext; 
194a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
194b0 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20  ext winShm with 
194c0 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e  the same winShmN
194d0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
194e0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
194f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
19500 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68  olding the winSh
19510 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
19520 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
19530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
19540 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
19550 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
19560 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
19570 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
19580 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
19590 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64  cks held */.#ifd
195a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
195b0 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195d0 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
195e0 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77  ction with its w
195f0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e  inShmNode */.#en
19600 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  dif.};../*.** Co
19610 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
19620 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
19630 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45  ine WIN_SHM_BASE
19640 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
19650 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
19660 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
19670 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
19680 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20  e WIN_SHM_DMS   
19690 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53   (WIN_SHM_BASE+S
196a0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
196b0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
196c0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
196d0 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ply advisory loc
196e0 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74  ks for all n byt
196f0 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  es beginning at 
19700 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ofst..*/.#define
19710 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23   _SHM_UNLCK  1.#
19720 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43  define _SHM_RDLC
19730 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  2.#define _SH
19740 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69  M_WRLCK  3.stati
19750 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74  c int winShmSyst
19760 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d  emLock(.  winShm
19770 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  Node *pFile,    
19780 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
19790 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
197a0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
197b0 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
197c0 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ype,         /* 
197d0 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d  _SHM_UNLCK, _SHM
197e0 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f  _RDLCK, or _SHM_
197f0 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
19800 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
19810 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69   /* Offset to fi
19820 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
19830 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a  ocked/unlocked *
19840 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20  /.  int nByte   
19850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19860 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
19870 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a  lock or unlock *
19880 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
19890 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
198a0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
198b0 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65   Lock/UnlockFile
198c0 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  Ex() */..  /* Ac
198d0 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53  cess to the winS
198e0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
198f0 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
19900 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
19910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
19920 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d  utex_held(pFile-
19930 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65  >mutex) || pFile
19940 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
19950 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
19960 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
19970 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20  =%d, offset=%d, 
19980 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  size=%d\n",.    
19990 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46         pFile->hF
199a0 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c  ile.h, lockType,
199b0 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a   ofst, nByte));.
199c0 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63  .  /* Release/Ac
199d0 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d  quire the system
199e0 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20  -level lock */. 
199f0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f   if( lockType==_
19a00 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
19a10 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46   rc = winUnlockF
19a20 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
19a30 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  e.h, ofst, 0, nB
19a40 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
19a50 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
19a60 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
19a70 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
19a80 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20    DWORD dwFlags 
19a90 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
19aa0 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20  IMMEDIATELY;.   
19ab0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d   if( lockType ==
19ac0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77   _SHM_WRLCK ) dw
19ad0 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c  Flags |= LOCKFIL
19ae0 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
19af0 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
19b00 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
19b10 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c  File.h, dwFlags,
19b20 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
19b30 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66   0);.  }.  .  if
19b40 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20  ( rc!= 0 ){.    
19b50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
19b70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
19b80 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
19b90 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
19ba0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
19bb0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
19bc0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63  CK file=%p, func
19bd0 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20  =%s, errno=%lu, 
19be0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
19bf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
19c00 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d  e.h, (lockType =
19c10 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20  = _SHM_UNLCK) ? 
19c20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20  "winUnlockFile" 
19c30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77 69  :.           "wi
19c40 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nLockFile", pFil
19c50 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71  e->lastErrno, sq
19c60 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
19c70 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
19c80 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
19c90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
19ca0 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
19cb0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
19cc0 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
19cd0 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
19ce0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
19cf0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
19d00 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
19d10 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
19d20 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
19d30 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
19d40 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
19d50 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
19d60 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
19d70 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
19d80 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
19d90 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
19da0 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
19db0 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
19dc0 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
19dd0 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
19de0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19df0 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
19e00 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
19e10 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
19e20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
19e30 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
19e40 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
19e50 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19e60 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ) );.  OSTRACE((
19e70 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25  "SHM-PURGE pid=%
19e80 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25  lu, deleteFlag=%
19e90 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19ea0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
19eb0 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65  cessId(), delete
19ec0 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26  Flag));.  pp = &
19ed0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
19ee0 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
19ef0 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
19f00 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
19f10 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
19f20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
19f30 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  { sqlite3_mutex_
19f40 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20  free(p->mutex); 
19f50 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
19f60 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
19f70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f  ++){.        BOO
19f80 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56  L bRc = osUnmapV
19f90 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65  iewOfFile(p->aRe
19fa0 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20  gion[i].pMap);. 
19fb0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
19fc0 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50  "SHM-PURGE-UNMAP
19fd0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
19fe0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1a010 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1a020 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1a030 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1a040 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1a050 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20  UE(bRc);.       
1a060 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61   bRc = osCloseHa
1a070 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  ndle(p->aRegion[
1a080 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].hMap);.      
1a090 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1a0a0 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d  PURGE-CLOSE pid=
1a0b0 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20  %lu, region=%d, 
1a0c0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1a0d0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1a0e0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1a0f0 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b  (), i, bRc ? "ok
1a100 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1a110 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56          UNUSED_V
1a120 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52  ARIABLE_VALUE(bR
1a130 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1a140 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
1a150 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69  !=NULL && p->hFi
1a160 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  le.h!=INVALID_HA
1a170 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
1a180 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a190 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1a1a0 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
1a1b0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1a1c0 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
1a1d0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1a1e0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1a1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a200 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
1a210 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1a220 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1a230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a240 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
1a250 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
1a260 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
1a270 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
1a280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
1a290 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1a2a0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1a2b0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1a2c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a2d0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1a2e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1a2f0 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
1a300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1a310 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
1a320 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
1a330 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1a340 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
1a350 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1a360 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1a370 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
1a380 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
1a390 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
1a3a0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
1a3b0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
1a3c0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
1a3d0 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
1a3e0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
1a3f0 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
1a400 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
1a410 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
1a420 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
1a430 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1a440 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
1a450 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
1a460 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
1a470 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
1a480 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
1a490 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
1a4a0 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1a4d0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1a4e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
1a4f0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1a500 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
1a510 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1a520 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1a530 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a550 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1a560 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1a570 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
1a580 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
1a590 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
1a5a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
1a5b0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a5d0 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
1a5e0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
1a5f0 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
1a600 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
1a610 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
1a620 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
1a630 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
1a640 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
1a650 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
1a660 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
1a670 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
1a680 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
1a690 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
1a6a0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
1a6b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1a6c0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
1a6d0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1a6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a6f0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65  R_NOMEM;.  nName
1a700 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1a710 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
1a720 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1a730 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
1a740 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
1a750 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a  + nName + 17 );.
1a760 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1a770 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a780 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
1a790 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1a7a0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  MEM;.  }.  pNew-
1a7b0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
1a7c0 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
1a7d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1a7e0 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
1a7f0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
1a800 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1a810 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
1a820 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
1a830 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
1a840 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a  ilename); ..  /*
1a850 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
1a860 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
1a870 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ting winShmNode 
1a880 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1a890 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  ** If no mat
1a8a0 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  ching winShmNode
1a8b0 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1a8c0 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  s, create a new 
1a8d0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53  one..  */.  winS
1a8e0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1a8f0 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d    for(pShmNode =
1a900 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1a910 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e   pShmNode; pShmN
1a920 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e  ode=pShmNode->pN
1a930 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44  ext){.    /* TBD
1a940 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70   need to come up
1a950 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74   with better mat
1a960 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70  ch here.  Perhap
1a970 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c  s.    ** use FIL
1a980 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e  E_ID_BOTH_DIR_IN
1a990 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20  FO Structure..  
1a9a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1a9b0 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d  ite3StrICmp(pShm
1a9c0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1a9d0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1a9e0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1a9f0 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
1aa00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1aa10 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
1aa20 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  lse{.    pShmNod
1aa30 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e  e = pNew;.    pN
1aa40 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69  ew = 0;.    ((wi
1aa50 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64  nFile*)(&pShmNod
1aa60 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20  e->hFile))->h = 
1aa70 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1aa80 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  ALUE;.    pShmNo
1aa90 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53  de->pNext = winS
1aaa0 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20  hmNodeList;.    
1aab0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
1aac0 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20   pShmNode;..    
1aad0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1aae0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1aaf0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1ab00 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
1ab10 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
1ab20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
1ab30 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1ab40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1ab50 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1ab60 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1ab70 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
1ab80 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
1ab90 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1aba0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
1abb0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1abc0 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
1abd0 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
1abe0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1abf0 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
1ac00 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
1ac10 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1ac40 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
1ac50 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1ac60 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20  E_OPEN_CREATE,. 
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
1ac90 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
1aca0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1acb0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1acc0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1acd0 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
1ace0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
1acf0 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
1ad00 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
1ad10 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
1ad20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
1ad30 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
1ad40 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
1ad50 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1ad60 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
1ad70 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
1ad80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ad90 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
1ada0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1adb0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1adc0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1add0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ade0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1adf0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1ae00 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
1ae10 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1ae20 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1ae40 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d  OpenShm", pDbFd-
1ae50 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1ae60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1ae70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ae80 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74        winShmSyst
1ae90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1aea0 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
1aeb0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1aec0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1aed0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1aee0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1aef0 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
1af00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1af10 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65  c ) goto shm_ope
1af20 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n_err;.  }..  /*
1af30 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
1af40 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
1af50 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   of the winShmNo
1af60 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
1af70 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
1af80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1af90 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
1afa0 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
1afb0 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
1afc0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
1afd0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1afe0 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  p;.  winShmLeave
1aff0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
1b000 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1b010 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
1b020 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b030 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
1b040 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
1b050 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e   of the winShmEn
1b060 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
1b070 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
1b080 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
1b090 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68  ew (struct winSh
1b0a0 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
1b0b0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
1b0c0 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
1b0d0 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
1b0e0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
1b0f0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
1b100 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
1b110 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
1b120 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
1b130 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
1b140 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
1b150 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
1b160 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
1b170 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
1b180 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b190 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1b1a0 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
1b1b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1b1c0 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
1b1d0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
1b1e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b1f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1b200 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b210 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1b220 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
1b230 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
1b240 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73  err:.  winShmSys
1b250 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1b260 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  , _SHM_UNLCK, WI
1b270 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1b280 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
1b290 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20  Fd->pVfs, 0);   
1b2a0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1b2b0 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
1b2c0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
1b2d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1b2e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b2f0 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  pNew);.  winShmL
1b300 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
1b310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b320 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
1b330 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1b340 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
1b350 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
1b360 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1b370 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1b380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b390 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  winShmUnmap(.  s
1b3a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1b3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1b3c0 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1b3d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1b3e0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1b400 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73  elete after clos
1b410 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ing if true */.)
1b420 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1b430 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Fd;       /* Dat
1b440 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1b450 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared-memory */. 
1b460 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1b470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1b480 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
1b490 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  losed */.  winSh
1b4a0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1b4b0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1b4c0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1b4d0 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68   file */.  winSh
1b4e0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
1b4f0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1b500 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
1b510 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70  nections */..  p
1b520 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1b530 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
1b540 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
1b550 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b560 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
1b570 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1b580 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
1b590 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
1b5a0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
1b5b0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
1b5c0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
1b5d0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
1b5e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1b5f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1b600 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
1b610 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
1b620 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1b630 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1b640 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1b650 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1b660 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1b670 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1b680 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1b690 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1b6a0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1b6b0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
1b6c0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
1b6d0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
1b6e0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
1b6f0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
1b700 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1b710 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69  ile, too */.  wi
1b720 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1b730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1b740 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
1b750 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1b760 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
1b770 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
1b780 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70     winShmPurge(p
1b790 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65  DbFd->pVfs, dele
1b7a0 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77  teFlag);.  }.  w
1b7b0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1b7c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1b7d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b7e0 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
1b7f0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
1b800 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1b810 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1b820 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20  t winShmLock(.  
1b830 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1b840 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1b850 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1b860 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1b870 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
1b880 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1b890 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
1b8a0 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
1b8b0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1b8c0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
1b8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b8e0 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
1b8f0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1b900 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1b910 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1b920 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1b930 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
1b940 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1b950 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1b960 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  *)fd;        /* 
1b970 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
1b980 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1b990 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20   */.  winShm *p 
1b9a0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b9c0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1b9d0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
1b9e0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20  .  winShm *pX;  
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1ba10 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1ba20 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77   siblings */.  w
1ba30 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1ba40 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1ba50 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1ba60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1ba70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ba80 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
1ba90 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1bac0 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
1bad0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
1bae0 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
1baf0 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
1bb00 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1bb10 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1bb20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1bb30 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1bb40 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1bb50 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1bb60 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1bb70 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1bb80 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1bb90 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1bba0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1bbb0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1bbc0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1bbd0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1bbe0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1bbf0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1bc00 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1bc10 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1bc20 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1bc30 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1bc40 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28  .  mask = (u16)(
1bc50 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d  (1U<<(ofst+n)) -
1bc60 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20   (1U<<ofst));.  
1bc70 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
1bc80 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
1bc90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1bca0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1bcb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1bcc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1bcd0 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
1bce0 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
1bcf0 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
1bd00 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1bd10 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
1bd20 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
1bd30 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
1bd40 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
1bd50 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1bd60 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1bd70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1bd80 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1bd90 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1bda0 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1bdb0 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1bdc0 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1bdd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
1bde0 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
1bdf0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1be00 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
1be10 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1be20 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
1be30 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
1be40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1be50 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1be60 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1be70 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _UNLCK, ofst+WIN
1be80 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1be90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1beb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1bec0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
1bed0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1bee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bef0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1bf00 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1bf10 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
1bf20 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
1bf30 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1bf40 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
1bf50 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
1bf60 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
1bf70 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
1bf80 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
1bf90 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
1bfa0 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
1bfb0 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
1bfc0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
1bfd0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
1bfe0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1bff0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
1c000 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
1c010 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
1c020 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
1c030 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
1c040 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
1c050 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
1c060 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1c070 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1c080 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1c090 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1c0a0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1c0b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c0c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1c0d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c0e0 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
1c0f0 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
1c100 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
1c110 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
1c120 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1c130 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
1c140 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
1c150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c160 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
1c170 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
1c180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1c190 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1c1a0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1c1b0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_RDLCK, ofst+W
1c1c0 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1c1d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c1e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c1f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1c200 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1c210 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
1c220 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1c230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c240 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
1c250 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
1c260 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c270 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
1c280 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
1c290 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
1c2a0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
1c2b0 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
1c2c0 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
1c2d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1c2e0 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
1c2f0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
1c300 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1c310 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1c320 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1c330 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1c340 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
1c350 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1c360 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
1c370 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1c380 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
1c390 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1c3a0 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
1c3b0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
1c3c0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1c3d0 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
1c3e0 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
1c3f0 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
1c400 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
1c410 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
1c420 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1c430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c440 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1c450 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1c460 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52  ShmNode, _SHM_WR
1c470 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1c480 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1c490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c4a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1c4b0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
1c4c0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
1c4d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
1c4e0 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1c4f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c500 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c510 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1c520 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
1c530 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1c540 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20  pid=%lu, id=%d, 
1c550 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c  sharedMask=%03x,
1c560 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20   exclMask=%03x, 
1c570 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1c580 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1c590 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
1c5a0 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  >id, p->sharedMa
1c5b0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
1c5c0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
1c5d0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1c5e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c5f0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1c600 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
1c610 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
1c620 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
1c630 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ory.  .**.** All
1c640 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
1c650 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
1c660 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
1c670 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
1c680 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
1c690 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
1c6a0 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
1c6b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1c6c0 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
1c6d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
1c6e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1c6f0 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
1c700 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1c710 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
1c720 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a  AMETER(fd);.  /*
1c730 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29   MemoryBarrier()
1c740 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f  ; // does not wo
1c750 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f  rk -- do not kno
1c760 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77  w why not */.  w
1c770 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1c780 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
1c790 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
1c7a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c7b0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
1c7c0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1c7d0 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20   region iRegion 
1c7e0 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65  of the .** share
1c7f0 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d-memory associa
1c800 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
1c810 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53  abase file fd. S
1c820 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1c830 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d  ions .** are num
1c840 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66  bered starting f
1c850 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73  rom zero. Each s
1c860 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1c870 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20  ion is szRegion 
1c880 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1c890 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
1c8a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1c8b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c8c0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
1c8d0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1c8e0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c8f0 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70  if the isWrite p
1c900 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
1c910 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1c920 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
1c930 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1c940 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1c950 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
1c960 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
1c970 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
1c980 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
1c990 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
1c9a0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
1c9b0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1c9c0 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69  If .** isWrite i
1c9d0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
1c9e0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1c9f0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1ca00 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a  n has not yet .*
1ca10 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
1ca20 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  , it is allocate
1ca30 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1ca40 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
1ca50 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1ca60 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  egion has alread
1ca70 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
1ca80 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   or is allocated
1ca90 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c   by.** this call
1caa0 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
1cab0 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ove, then it is 
1cac0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
1cad0 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61   processes .** a
1cae0 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66  ddress space (if
1caf0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1cb00 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20  dy), *pp is set 
1cb10 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1cb20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72  mapped .** memor
1cb30 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
1cb40 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1cb50 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61  tic int winShmMa
1cb60 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1cb70 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1cb80 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
1cb90 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
1cba0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
1cbb0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1cbc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1cbd0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
1cbe0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
1cbf0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1cc00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1cc10 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1cc20 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20   isWrite,       
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc40 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
1cc50 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
1cc60 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
1cc70 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
1cc80 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
1cc90 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
1cca0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1ccb0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1ccc0 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  d;.  winShm *p =
1ccd0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1cce0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1ccf0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1cd00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1cd10 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20  f( !p ){.    rc 
1cd20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  = winOpenSharedM
1cd30 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
1cd40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cd50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1cd60 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  .    p = pDbFd->
1cd70 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d  pShm;.  }.  pShm
1cd80 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1cd90 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de;..  sqlite3_m
1cda0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1cdb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  ode->mutex);.  a
1cdc0 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
1cdd0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
1cde0 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
1cdf0 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a  >nRegion==0 );..
1ce00 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1ce10 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1ce20 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
1ce30 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b  hmRegion *apNew;
1ce40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1ce50 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61  w aRegion[] arra
1ce60 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
1ce70 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29  te = (iRegion+1)
1ce80 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d  *szRegion;  /* M
1ce90 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
1cea0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1ceb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
1cec0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
1ced0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
1cee0 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78  ize of wal-index
1cef0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53   file */..    pS
1cf00 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1cf10 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
1cf20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1cf30 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
1cf40 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1cf50 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1cf60 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  ess space..    *
1cf70 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1cf80 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1cf90 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1cfa0 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1cfb0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61  ile is.    ** la
1cfc0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
1cfd0 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
1cfe0 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
1cff0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   */.    rc = win
1d000 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
1d010 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1d020 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b  de->hFile, &sz);
1d030 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d050 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1d060 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1d070 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74  MSIZE, osGetLast
1d080 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
1d0b0 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1d0c0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1d0d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
1d0e0 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
1d0f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
1d100 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1d110 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
1d120 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
1d130 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
1d140 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
1d150 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1d160 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1d170 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1d180 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
1d190 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
1d1a0 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
1d1b0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
1d1c0 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
1d1d0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
1d1e0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1d1f0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
1d200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1d210 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
1d220 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1d230 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1d240 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1d250 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1d260 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
1d270 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d290 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1d2a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d2b0 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1d2c0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1d2f0 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  2", pDbFd->zPath
1d300 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1d310 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1d320 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d330 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
1d340 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1d350 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
1d360 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
1d370 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
1d380 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d  ew = (struct Shm
1d390 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33  Region *)sqlite3
1d3a0 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1d3b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1d3c0 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
1d3d0 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d  *sizeof(apNew[0]
1d3e0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
1d3f0 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
1d400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1d410 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1d420 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1d430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
1d440 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20  Node->aRegion = 
1d450 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c  apNew;..    whil
1d460 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
1d470 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1d480 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  .      HANDLE hM
1d490 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ap = NULL;      
1d4a0 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69     /* file-mappi
1d4b0 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ng handle */.   
1d4c0 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20     void *pMap = 
1d4d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1d4e0 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  * Mapped memory 
1d4f0 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a  region */.     .
1d500 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d510 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  NRT.      hMap =
1d520 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1d530 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d  pingFromApp(pShm
1d540 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1d550 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1d560 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e  AGE_READWRITE, n
1d570 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20  Byte, NULL.     
1d580 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1d590 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1d5a0 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68  AS_WIDE).      h
1d5b0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1d5c0 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e  leMappingW(pShmN
1d5d0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20  ode->hFile.h, . 
1d5e0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1d5f0 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1d600 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1d610 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1d620 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1d630 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
1d640 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1d650 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53  eFileMappingA(pS
1d660 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1d670 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c   .          NULL
1d680 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1d690 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1d6a0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  .      );.#endif
1d6b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d6c0 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20  "SHM-MAP-CREATE 
1d6d0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1d6e0 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1d6f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1d700 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1d710 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1d720 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d730 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1d740 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
1d750 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1d760 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
1d770 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1d780 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
1d790 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
1d7a0 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
1d7b0 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
1d7c0 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
1d7d0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1d7e0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23  onGranularity;.#
1d7f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1d800 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  RT.        pMap 
1d810 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1d820 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46  eFromApp(hMap, F
1d830 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1d840 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1d850 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73             iOffs
1d860 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
1d870 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
1d880 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
1d890 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
1d8a0 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1d8b0 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c  ViewOfFile(hMap,
1d8c0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1d8d0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1d8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
1d8f0 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1d900 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1d910 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1d920 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69          );.#endi
1d930 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  f.        OSTRAC
1d940 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20  E(("SHM-MAP-MAP 
1d950 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1d960 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1d970 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
1d980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d990 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d9a0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
1d9b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
1d9c0 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
1d9d0 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
1d9e0 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
1d9f0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1da00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1da10 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
1da20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
1da30 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1da40 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
1da50 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1da60 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1da70 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
1da80 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22      "winShmMap3"
1dab0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1dac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
1dad0 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  p ) osCloseHandl
1dae0 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  e(hMap);.       
1daf0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1db00 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1db10 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1db20 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1db30 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d  egion].pMap = pM
1db40 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
1db50 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
1db60 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68  Node->nRegion].h
1db70 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20  Map = hMap;.    
1db80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
1db90 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
1dba0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
1dbb0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1dbc0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
1dbd0 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  {.    int iOffse
1dbe0 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65  t = iRegion*szRe
1dbf0 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f  gion;.    int iO
1dc00 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
1dc10 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
1dc20 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
1dc30 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63  anularity;.    c
1dc40 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a  har *p = (char *
1dc50 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69  )pShmNode->aRegi
1dc60 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  on[iRegion].pMap
1dc70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69  ;.    *pp = (voi
1dc80 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68  d *)&p[iOffsetSh
1dc90 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ift];.  }else{. 
1dca0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
1dcb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1dcc0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1dcd0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1dce0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20   rc;.}..#else.# 
1dcf0 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70  define winShmMap
1dd00 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
1dd10 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  winShmLock    0.
1dd20 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42  # define winShmB
1dd30 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
1dd40 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20  e winShmUnmap   
1dd50 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
1dd60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dd70 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c  WAL */../*.** Cl
1dd80 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70  eans up the mapp
1dd90 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65  ed region of the
1dda0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
1ddb0 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20   if any..*/.#if 
1ddc0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1ddd0 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
1dde0 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77  t winUnmapfile(w
1ddf0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
1de00 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
1de10 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
1de20 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1de30 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1de40 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67  hMap=%p, pMapReg
1de50 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1de60 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25       "mmapSize=%
1de70 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74  lld, mmapSizeAct
1de80 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ual=%lld, mmapSi
1de90 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20  zeMax=%lld\n",. 
1dea0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1deb0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1dec0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
1ded0 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d  >hMap, pFile->pM
1dee0 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  apRegion,.      
1def0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1df00 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  Size, pFile->mma
1df10 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69  pSizeActual, pFi
1df20 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29  le->mmapSizeMax)
1df30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
1df40 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
1df50 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69    if( !osUnmapVi
1df60 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
1df70 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20  pMapRegion) ){. 
1df80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1df90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1dfa0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1dfb0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1dfc0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1dfd0 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  ile=%p, pMapRegi
1dfe0 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
1dff0 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49          "rc=SQLI
1e000 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
1e010 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
1e020 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1e030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e040 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1e050 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  on));.      retu
1e060 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1e070 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1e080 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1e090 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1e0b0 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46  nUnmapfile1", pF
1e0c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1e0d0 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d   }.    pFile->pM
1e0e0 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
1e0f0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1e100 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
1e110 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1e120 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1e130 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c  pFile->hMap!=NUL
1e140 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  L ){.    if( !os
1e150 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
1e160 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20  e->hMap) ){.    
1e170 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1e180 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1e190 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
1e1a0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1e1b0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1e1c0 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63  =%p, hMap=%p, rc
1e1d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1e1e0 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AP\n",.         
1e1f0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1e200 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e210 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61  File, pFile->hMa
1e220 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  p));.      retur
1e230 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1e240 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1e250 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1e260 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1e270 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1e280 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69  Unmapfile2", pFi
1e290 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
1e2a0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61  }.    pFile->hMa
1e2b0 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  p = NULL;.  }.  
1e2c0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1e2d0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1e2e0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1e2f0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1e300 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1e310 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1e320 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
1e330 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e340 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
1e350 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
1e360 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
1e370 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
1e380 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
1e390 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
1e3a0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
1e3b0 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
1e3c0 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
1e3d0 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
1e3e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
1e3f0 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
1e400 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
1e410 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
1e420 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1e430 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
1e440 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
1e450 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1e460 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1e470 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
1e480 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
1e490 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
1e4a0 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
1e4b0 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
1e4c0 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
1e4d0 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
1e4e0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
1e4f0 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
1e500 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
1e510 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1e520 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
1e530 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
1e540 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
1e550 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
1e560 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
1e570 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
1e580 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
1e590 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
1e5a0 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63  _MMAP_SIZE, whic
1e5b0 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
1e5c0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
1e5d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
1e5e0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1e5f0 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
1e600 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
1e610 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
1e620 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
1e630 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
1e640 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
1e650 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
1e660 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1e670 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28   int winMapfile(
1e680 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71  winFile *pFd, sq
1e690 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
1e6a0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  e){.  sqlite3_in
1e6b0 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  t64 nMap = nByte
1e6c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1e6d0 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
1e6e0 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
1e6f0 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ==0 );.  OSTRACE
1e700 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
1e710 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73  %lu, pFile=%p, s
1e720 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  ize=%lld\n",.   
1e730 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e740 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e750 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a   pFd, nByte));..
1e760 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
1e770 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
1e780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1e790 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
1e7a0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1e7b0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
1e7c0 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20  pFd, &nMap);.   
1e7d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e7e0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1e7f0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1e800 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1e810 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c  _IOERR_FSTAT\n",
1e820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e830 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e840 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
1e850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e860 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1e870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1e880 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
1e890 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
1e8a0 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
1e8b0 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61  zeMax;.  }.  nMa
1e8c0 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69  p &= ~(sqlite3_i
1e8d0 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f  nt64)(winSysInfo
1e8e0 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29  .dwPageSize - 1)
1e8f0 3b 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d  ;. .  if( nMap==
1e900 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69  0 && pFd->mmapSi
1e910 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55  ze>0 ){.    winU
1e920 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1e930 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70   }.  if( nMap!=p
1e940 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
1e950 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1e960 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72   0;.    DWORD pr
1e970 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
1e980 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44  DONLY;.    DWORD
1e990 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
1e9a0 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e  P_READ;..    win
1e9b0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1e9c0 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74      if( (pFd->ct
1e9d0 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
1e9e0 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  E_RDONLY)==0 ){.
1e9f0 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20        protect = 
1ea00 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a  PAGE_READWRITE;.
1ea10 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46        flags |= F
1ea20 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20  ILE_MAP_WRITE;. 
1ea30 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
1ea40 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
1ea50 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1ea60 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1ea70 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
1ea80 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
1ea90 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1eaa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1eab0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1eac0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1ead0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1eae0 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
1eaf0 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  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 28 44 57 4f 52 44 29           (DWORD)
1eb20 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1eb30 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
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 28 44 57 4f 52             (DWOR
1eb60 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1eb70 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1eb80 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1eb90 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1eba0 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  I).    pFd->hMap
1ebb0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1ebc0 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20  appingA(pFd->h, 
1ebd0 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ec00 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1ec10 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1ec20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1ec50 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1ec60 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  L);.#endif.    i
1ec70 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55  f( pFd->hMap==NU
1ec80 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d  LL ){.      pFd-
1ec90 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1eca0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1ecb0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1ecc0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1ecd0 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
1ece0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70  "winMapfile1", p
1ed10 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1ed20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
1ed30 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
1ed40 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
1ed50 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
1ed60 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
1ed70 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1ed80 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
1ed90 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
1eda0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1edb0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1edc0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1edd0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1ede0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1edf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ee00 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1ee10 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73  ( (nMap % winSys
1ee20 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29  Info.dwPageSize)
1ee30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1ee40 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54  t( sizeof(SIZE_T
1ee50 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  )==sizeof(sqlite
1ee60 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70  3_int64) || nMap
1ee70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a  <=0xffffffff );.
1ee80 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1ee90 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  NRT.    pNew = o
1eea0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1eeb0 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c  omApp(pFd->hMap,
1eec0 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45   flags, 0, (SIZE
1eed0 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a  _T)nMap);.#else.
1eee0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
1eef0 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e  ViewOfFile(pFd->
1ef00 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
1ef10 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29  0, (SIZE_T)nMap)
1ef20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1ef30 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
1ef40 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
1ef50 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20  le(pFd->hMap);. 
1ef60 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d       pFd->hMap =
1ef70 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64   NULL;.      pFd
1ef80 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1ef90 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1efa0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1efb0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1efc0 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
1efd0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20   "winMapfile2", 
1f000 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1f010 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
1f020 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
1f030 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
1f040 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
1f050 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
1f060 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1f070 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  E-MAP pid=%lu, p
1f080 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1f090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f0a0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1f0b0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1f0c0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1f0d0 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
1f0e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f0f0 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61    }.    pFd->pMa
1f100 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a  pRegion = pNew;.
1f110 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1f120 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46  e = nMap;.    pF
1f130 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
1f140 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20  l = nMap;.  }.. 
1f150 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1f160 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1f170 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1f180 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1f190 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f1a0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
1f1b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1f1c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1f1d0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
1f1e0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
1f1f0 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
1f200 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1f210 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
1f220 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
1f230 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
1f240 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
1f250 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
1f260 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
1f270 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
1f280 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
1f290 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
1f2a0 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
1f2b0 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
1f2c0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
1f2d0 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
1f2e0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1f2f0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
1f300 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1f310 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
1f320 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
1f330 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
1f340 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f350 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
1f360 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
1f370 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
1f380 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1f390 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
1f3a0 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
1f3b0 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
1f3c0 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
1f3d0 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
1f3e0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
1f3f0 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65   calling winUnfe
1f400 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tch()..*/.static
1f410 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71   int winFetch(sq
1f420 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1f430 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41  i64 iOff, int nA
1f440 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a  mt, void **pp){.
1f450 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1f460 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
1f470 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
1f480 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
1f490 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
1f4a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
1f4b0 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
1f4c0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45  ..  OSTRACE(("FE
1f4d0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1f4e0 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
1f4f0 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70  ld, amount=%d, p
1f500 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
1f510 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f520 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
1f530 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29   iOff, nAmt, pp)
1f540 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
1f550 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1f560 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
1f570 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69  zeMax>0 ){.    i
1f580 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
1f590 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  on==0 ){.      i
1f5a0 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69  nt rc = winMapfi
1f5b0 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
1f5c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f5d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f5e0 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
1f5f0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f600 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1f620 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f630 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
1f640 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1f650 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f660 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1f670 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e   }.    if( pFd->
1f680 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66  mmapSize >= iOff
1f690 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a  +nAmt ){.      *
1f6a0 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64  pp = &((u8 *)pFd
1f6b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
1f6c0 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ff];.      pFd->
1f6d0 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
1f6e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1f6f0 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
1f700 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f710 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25  %p, pp=%p, *pp=%
1f720 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1f730 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1f740 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1f750 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20  ssId(), fd, pp, 
1f760 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  *pp));.  return 
1f770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f780 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
1f790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1f7a0 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
1f7b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
1f7c0 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
1f7d0 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
1f7e0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
1f7f0 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68  o winFetch(). Th
1f800 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
1f810 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1f820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
1f830 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1f840 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1f850 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  ng.** argument t
1f860 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74  hat was passed t
1f870 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28 29  o the winFetch()
1f880 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a   invocation. .**
1f890 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
1f8a0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
1f8b0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
1f8c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
1f8d0 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f  ng called .** to
1f8e0 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20   inform the VFS 
1f8f0 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f  layer that, acco
1f900 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20  rding to POSIX, 
1f910 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  any existing map
1f920 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77  ping .** may now
1f930 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
1f940 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
1f950 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f960 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c  t winUnfetch(sql
1f970 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
1f980 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
1f990 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
1f9a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1f9b0 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  winFile *pFd = (
1f9c0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f  winFile*)fd;   /
1f9d0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1f9e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f9f0 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  /..  /* If p==0 
1fa00 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
1fa10 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
1fa20 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
1fa30 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
1fa40 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
1fa50 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
1fa60 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
1fa70 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
1fa80 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
1fa90 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
1faa0 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
1fab0 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
1fac0 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
1fad0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
1fae0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
1faf0 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
1fb00 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
1fb10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
1fb20 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
1fb30 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
1fb40 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54  [iOff] );..  OST
1fb50 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70  RACE(("UNFETCH p
1fb60 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1fb70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70  , offset=%lld, p
1fb80 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
1fb90 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1fba0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1fbb0 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69   iOff, p));..  i
1fbc0 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
1fbd0 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
1fbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49  }else{.    /* FI
1fbf0 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73  XME:  If Windows
1fc00 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72   truly always pr
1fc10 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e  events truncatin
1fc20 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a  g or deleting a.
1fc30 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c      ** file whil
1fc40 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68  e a mapping is h
1fc50 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  eld, then the fo
1fc60 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70  llowing winUnmap
1fc70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20  file() call.    
1fc80 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72  ** is unnecessar
1fc90 79 20 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69  y can can be omi
1fca0 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c  tted - potential
1fcb0 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20  ly improving.   
1fcc0 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e   ** performance.
1fcd0 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61    */.    winUnma
1fce0 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a  pfile(pFd);.  }.
1fcf0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
1fd00 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a  nFetchOut>=0 );.
1fd10 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
1fd20 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
1fd30 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1fd40 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1fd50 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1fd60 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1fd70 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75  (), fd));.  retu
1fd80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fd90 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
1fda0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1fdb0 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
1fdc0 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
1fdd0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1fde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
1fdf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
1fe00 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1fe10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe20 2a 2a 2a 0a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
1fe80 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
1fe90 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
1fea0 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
1feb0 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  on an.** sqlite3
1fec0 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e  _file for win32.
1fed0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1fee0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1fef0 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20  ods winIoMethod 
1ff00 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20  = {.  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 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1ff30 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c  n */.  winClose,
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1ff60 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20   */.  winRead,  
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
1ff90 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20  /.  winWrite,   
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffb0 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
1ffc0 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20  .  winTruncate, 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
1fff0 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20  */.  winSync,   
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
20020 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20  .  winFileSize, 
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
20050 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20  */.  winLock,   
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
20080 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20  .  winUnlock,   
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
200b0 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
200c0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  vedLock,        
200d0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
200e0 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  rvedLock */.  wi
200f0 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  nFileControl,   
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20110 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
20120 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  .  winSectorSize
20130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20140 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
20150 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65  e */.  winDevice
20160 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
20170 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63         /* xDevic
20180 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20190 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c   */.  winShmMap,
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
201c0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b   */.  winShmLock
201d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
201e0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
201f0 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72  k */.  winShmBar
20200 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
20210 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
20220 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
20230 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
20240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20250 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e  hmUnmap */.  win
20260 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20280 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55  xFetch */.  winU
20290 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20  nfetch          
202a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
202b0 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f  Unfetch */.};../
202c0 2a 2a 2a 2a 2a 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 0a 2a 2a 2a  ************.***
20310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20320 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
20330 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
20340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
20360 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
20370 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
20380 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
20390 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
203a0 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
203b0 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  ct..*/..#if defi
203c0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
203d0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
203e0 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68  filename from wh
203f0 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65 72  atever the under
20400 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
20410 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72  system.** suppor
20420 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73  ts for filenames
20430 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70   into UTF-8.  Sp
20440 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
20450 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74  result is.** obt
20460 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
20470 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  c and must be fr
20480 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
20490 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
204a0 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
204b0 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
204c0 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64  ename(const void
204d0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
204e0 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64  char *zConverted
204f0 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
20500 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
20510 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63  verted = winUnic
20520 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e  odeToUtf8(zFilen
20530 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
20540 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
20550 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
20560 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20570 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
20580 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c 65  cs_to_utf8(zFile
20590 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
205a0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
205b0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
205c0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
205d0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
205e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
205f0 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
20600 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68  filename into wh
20610 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20  atever form the 
20620 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70  underlying.** op
20630 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77  erating system w
20640 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69  ants filenames i
20650 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
20660 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  d the result.** 
20670 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
20680 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
20690 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
206a0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
206b0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
206c0 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74  void *winConvert
206d0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
206e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
206f0 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20  lename){.  void 
20700 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b  *zConverted = 0;
20710 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
20720 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
20730 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  d = winUtf8ToUni
20740 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
20750 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
20760 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
20770 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43  I.  else{.    zC
20780 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
20790 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
207a0 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29  _mbcs(zFilename)
207b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f  ;.  }.#endif.  /
207c0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  * caller will ha
207d0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ndle out of memo
207e0 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a  ry */.  return z
207f0 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a  Converted;.}../*
20800 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20810 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
20820 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
20830 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67  ied UTF-8 string
20840 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20   buffer.** ends 
20850 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72 79  with a directory
20860 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
20870 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20  cter or one was 
20880 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20  successfully.** 
20890 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a  added to it..*/.
208a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
208b0 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e  keEndInDirSep(in
208c0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
208d0 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20  uf){.  if( zBuf 
208e0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20  ){.    int nLen 
208f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20900 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28  0(zBuf);.    if(
20910 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20   nLen>0 ){.     
20920 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65 70   if( winIsDirSep
20930 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29  (zBuf[nLen-1]) )
20940 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20950 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
20960 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20  if( nLen+1<nBuf 
20970 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b  ){.        zBuf[
20980 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69  nLen] = winGetDi
20990 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20  rSep();.        
209a0 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27  zBuf[nLen+1] = '
209b0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74  \0';.        ret
209c0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
209d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
209e0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
209f0 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
20a00 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73   file name and s
20a10 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69  tore the resulti
20a20 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  ng pointer into 
20a30 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f  pzBuf..** The po
20a40 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
20a50 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20  n pzBuf must be 
20a60 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74 65  freed via sqlite
20a70 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
20a80 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65  tic int winGetTe
20a90 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  mpname(sqlite3_v
20aa0 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a  fs *pVfs, char *
20ab0 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69  *pzBuf){.  stati
20ac0 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
20ad0 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
20ae0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
20af0 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
20b00 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
20b10 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
20b20 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69  789";.  size_t i
20b30 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20  , j;.  int nPre 
20b40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20b50 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  0(SQLITE_TEMP_FI
20b60 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e  LE_PREFIX);.  in
20b70 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44  t nMax, nBuf, nD
20b80 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72  ir, nLen;.  char
20b90 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74   *zBuf;..  /* It
20ba0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
20bb0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
20bc0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
20bd0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
20be0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
20bf0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
20c00 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
20c10 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
20c20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
20c30 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
20c40 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
20c50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
20c60 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f  TE_IOERR );..  /
20c70 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
20c80 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
20c90 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79   store the fully
20ca0 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a   qualified file.
20cb0 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
20cc0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
20cd0 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  .  If this fails
20ce0 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74  , we cannot cont
20cf0 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61  inue..  */.  nMa
20d00 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  x = pVfs->mxPath
20d10 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61  name; nBuf = nMa
20d20 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20  x + 2;.  zBuf = 
20d30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
20d40 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28  o( nBuf );.  if(
20d50 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53   !zBuf ){.    OS
20d60 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
20d70 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
20d80 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
20d90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20da0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
20db0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
20dc0 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
20dd0 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
20de0 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
20df0 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
20e00 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
20e10 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
20e20 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
20e30 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
20e40 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
20e50 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
20e60 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
20e70 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
20e80 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
20e90 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
20ea0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
20eb0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
20ec0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
20ed0 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
20ee0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
20ef0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
20f00 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
20f10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
20f20 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
20f30 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
20f40 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
20f50 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
20f60 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
20f70 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
20f80 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
20f90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
20fa0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
20fb0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
20fc0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
20fd0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
20fe0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
20ff0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
21000 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
21010 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
21020 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
21030 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
21040 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
21050 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21060 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
21070 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
21080 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
21090 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
210a0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
210b0 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
210c0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
210d0 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
210e0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
210f0 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
21100 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21110 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
21120 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
21130 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
21140 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
21150 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
21160 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
21170 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
21180 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
21190 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
211a0 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
211b0 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
211c0 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
211d0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
211e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
211f0 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
21200 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
21210 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
21220 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
21230 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
21240 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
21250 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
21260 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
21270 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
21280 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
21290 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
212a0 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
212b0 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
212c0 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
212d0 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
212e0 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
212f0 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
21300 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
21310 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
21320 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
21330 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
21340 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
21350 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
21360 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
21370 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21380 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
21390 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
213a0 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
213b0 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
213c0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
213d0 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
213e0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
213f0 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
21400 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
21410 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
21420 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
21430 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
21440 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
21450 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
21460 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
21470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21480 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
21490 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
214a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
214b0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
214c0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
214d0 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
214e0 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
214f0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
21500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21510 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
21520 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21530 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21540 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
21560 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21570 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
21580 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  }.        if( wi
21590 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
215a0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
215b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
215c0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
215d0 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
215e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
215f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
21600 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21630 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21650 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
21660 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
21670 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20  nMax+1 );.      
21680 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
21690 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
216a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
216b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
216c0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
216d0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
216e0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
216f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21700 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21710 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
21720 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77          if( cygw
21730 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
21750 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
21760 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
21770 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
21780 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20  , zDir,.        
21790 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
217a0 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b  ed, nMax+1)<0 ){
217b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
217c0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
217d0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ed);.          s
217e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
217f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
21800 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
21810 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
21820 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22  OERR_CONVPATH\n"
21830 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
21840 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
21850 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  (SQLITE_IOERR_CO
21860 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
21870 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
218a0 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  me2", zDir);.   
218b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
218c0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
218d0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
218e0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
218f0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
21900 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72  he candidate dir
21910 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e  ectory exists an
21920 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20  d should.       
21930 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20     ** be used.  
21940 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20  However, we may 
21950 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  need to convert 
21960 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  the string conta
21970 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ining.          
21980 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f  ** its name into
21990 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20   UTF-8 (i.e. if 
219a0 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67  it is UTF-16 rig
219b0 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20  ht now)..       
219c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
219d0 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
219e0 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
219f0 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65  lename(zConverte
21a00 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
21a10 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
21a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21a30 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21a50 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
21a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  ;.            OS
21a70 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21a80 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21a90 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
21aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
21ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21ac0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
21ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
21ae0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21af0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
21b00 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
21b10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21b20 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20  (zUtf8);.       
21b30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21b40 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
21b50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21b70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21b80 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21b90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69  }.    }.  }.#eli
21ba0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
21bb0 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
21bc0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
21bd0 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29  e if( osIsNT() )
21be0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
21bf0 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a  ti;.    LPWSTR z
21c00 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74  WidePath = sqlit
21c10 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
21c20 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ax*sizeof(WCHAR)
21c30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69   );.    if( !zWi
21c40 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  dePath ){.      
21c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
21c60 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
21c70 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
21c80 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
21c90 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
21ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21cb0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
21cc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47     }.    if( osG
21cd0 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61 78  etTempPathW(nMax
21ce0 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30 20  , zWidePath)==0 
21cf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21d00 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
21d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21d20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
21d30 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
21d40 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
21d50 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
21d60 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
21d70 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
21d80 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
21d90 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
21da0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
21db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21dc0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
21dd0 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b  tTempname2", 0);
21de0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74  .    }.    zMult
21df0 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  i = winUnicodeTo
21e00 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b  Utf8(zWidePath);
21e10 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20  .    if( zMulti 
21e20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21e30 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
21e40 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  zBuf, "%s", zMul
21e50 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
21e60 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
21e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21e80 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
21e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ea0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
21eb0 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
21ec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
21ed0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
21ee0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
21ef0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
21f00 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
21f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21f20 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
21f30 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
21f40 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
21f50 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
21f60 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
21f70 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61     char *zMbcsPa
21f80 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
21f90 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a  ocZero( nMax );.
21fa0 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61      if( !zMbcsPa
21fb0 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
21fc0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21fd0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21fe0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
21ff0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
22000 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
22010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22020 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
22030 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
22040 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d  mpPathA(nMax, zM
22050 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
22060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22070 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22080 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22090 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
220a0 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
220b0 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
220c0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
220d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
220e0 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
220f0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
22120 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20  mpname3", 0);.  
22130 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20    }.    zUtf8 = 
22140 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
22150 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
22160 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
22170 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
22180 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22190 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
221a0 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
221b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
221c0 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
221d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
221e0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
221f0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22200 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22210 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22220 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22240 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  EM;.    }.  }.#e
22250 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
22260 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f  IN32_HAS_ANSI */
22270 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
22280 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
22290 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
222a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
222b0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
222c0 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20 61  tory ends with a
222d0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
222e0 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49  ** separator.  I
222f0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e  f it does not an
22300 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  d there is not e
22310 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
22320 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65   to add.  ** one
22330 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69  , fail..  */.  i
22340 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  f( !winMakeEndIn
22350 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a  DirSep(nDir+1, z
22360 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Buf) ){.    sqli
22370 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22380 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22390 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
223a0 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
223b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
223c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
223d0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
223e0 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b  tTempname4", 0);
223f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
22400 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
22410 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
22420 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
22430 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
22440 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 20 69  ile .  ** name i
22450 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
22460 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a  format:.  **.  *
22470 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f  *   "<temporary_
22480 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71  directory>/etilq
22490 73 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58  s_XXXXXXXXXXXXXX
224a0 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a  X\0\0".  **.  **
224b0 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
224c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54  SQLITE_ERROR.  T
224d0 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20  he number 17 is 
224e0 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64  used here in ord
224f0 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75  er to.  ** accou
22500 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65  nt for the space
22510 20 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20   used by the 15 
22520 63 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d  character random
22530 20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a   suffix and the.
22540 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e    ** two trailin
22550 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73  g NUL characters
22560 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72  .  The final dir
22570 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
22580 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20   character.  ** 
22590 68 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65  has already adde
225a0 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  d if it was not 
225b0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e  already present.
225c0 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73  .  */.  nLen = s
225d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
225e0 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65  Buf);.  if( (nLe
225f0 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e  n + nPre + 17) >
22600 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c   nBuf ){.    sql
22610 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22620 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
22630 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22640 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
22650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
22660 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22670 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
22680 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29  etTempname5", 0)
22690 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
226a0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
226b0 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65  6-nLen, zBuf+nLe
226c0 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  n, SQLITE_TEMP_F
226d0 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20  ILE_PREFIX);..  
226e0 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
226f0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
22700 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
22710 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
22720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
22730 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
22740 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
22750 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
22760 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
22770 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
22780 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
22790 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b  [j] = 0;.  zBuf[
227a0 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42  j+1] = 0;.  *pzB
227b0 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53  uf = zBuf;..  OS
227c0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
227d0 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ENAME name=%s, r
227e0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
227f0 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
22800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
22820 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
22830 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64  le is really a d
22840 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72  irectory.  Retur
22850 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74  n false if.** it
22860 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   is something ot
22870 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63  her than a direc
22880 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72  tory, or if ther
22890 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
228a0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
228b0 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  ation failure..*
228c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
228d0 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
228e0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20   *zConverted){. 
228f0 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
22900 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
22910 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
22920 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
22930 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
22940 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
22950 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
22960 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
22970 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
22980 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
22990 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
229a0 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
229b0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
229c0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
229d0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
22a00 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
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 26 73 41 74 74 72 44 61          &sAttrDa
22a30 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79  ta)) && winRetry
22a40 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
22a50 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20  tErrno) ){}.    
22a60 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
22a70 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e   return 0; /* In
22a80 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20  valid name? */. 
22a90 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20     }.    attr = 
22aa0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
22ab0 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20  Attributes;.#if 
22ac0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
22ad0 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
22ae0 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
22af0 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
22b00 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
22b10 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
22b20 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c  urn (attr!=INVAL
22b30 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
22b40 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c  ES) && (attr&FIL
22b50 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
22b60 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  CTORY);.}../*.**
22b70 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
22b80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
22b90 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
22ba0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
22bb0 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20   /* Used to get 
22bc0 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d  maximum path nam
22bd0 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f  e length */.  co
22be0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
22bf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22c00 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
22c10 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
22c20 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
22c30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
22c40 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
22c50 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
22c60 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
22c70 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
22c80 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
22c90 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
22ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
22cb0 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
22cc0 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
22cd0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
22ce0 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44  rno = 0;.  DWORD
22cf0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
22d00 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
22d10 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
22d20 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
22d30 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
22d40 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
22d50 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
22d60 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
22d70 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
22d80 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
22d90 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
22da0 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
22db0 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
22dc0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
22dd0 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
22de0 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
22df0 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
22e00 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
22e10 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
22e20 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
22e30 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
22e40 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
22e50 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
22e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
22e70 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
22e80 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
22e90 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
22ea0 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
22eb0 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
22ec0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
22ed0 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20   *zTmpname = 0; 
22ee0 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  /* For temporary
22ef0 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65   filename, if ne
22f00 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69  cessary. */..  i
22f10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22f20 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
22f30 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
22f40 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
22f50 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
22f60 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
22f70 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
22f80 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
22f90 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
22fa0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
22fb0 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
22fc0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
22fd0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
22fe0 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
22ff0 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
23000 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23010 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23020 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
23030 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
23040 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
23050 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
23060 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
23070 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
23080 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
23090 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
230a0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
230b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
230c0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
230d0 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
230e0 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
230f0 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
23100 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23110 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
23120 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
23130 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
23140 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
23150 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23160 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
23170 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
23180 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23190 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61  s, pFile=%p, fla
231a0 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73  gs=%x, pOutFlags
231b0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
231c0 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64     zUtf8Name, id
231d0 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
231e0 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  gs));..  /* Chec
231f0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
23200 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
23210 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
23220 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
23230 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
23240 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
23250 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
23260 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
23270 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
23280 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
23290 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
232a0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
232b0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
232c0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
232d0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
232e0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
232f0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
23300 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
23310 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
23320 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
23330 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
23340 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
23350 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
23360 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
23370 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
23380 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
23390 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
233a0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
233b0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
233c0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
233d0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
233e0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
233f0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
23400 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
23410 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
23420 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
23430 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
23440 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
23450 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
23460 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
23470 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
23480 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
23490 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
234a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
234b0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
234c0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
234d0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
234e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
234f0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
23500 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
23510 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
23520 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
23530 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
23540 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
23550 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
23560 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
23570 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
23580 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
23590 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
235a0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
235b0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
235c0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
235d0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
235e0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
235f0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
23600 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
23610 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
23620 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
23630 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
23640 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23650 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
23660 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
23670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
23680 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
23690 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
236a0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
236b0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
236c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
236d0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
236e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
236f0 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
23700 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
23710 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
23720 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
23730 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
23740 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
23750 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
23760 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
23770 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20  ( !zUtf8Name && 
23780 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  !sqlite3_temp_di
23790 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
237a0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
237b0 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20  E_ERROR,.       
237c0 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   "sqlite3_temp_d
237d0 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c  irectory variabl
237e0 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  e should be set 
237f0 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d  for WinRT");.  }
23800 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
23810 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
23820 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
23830 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
23840 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20  enerate a .  ** 
23850 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
23860 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f  ame to use .  */
23870 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
23880 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
23890 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73   isDelete && !is
238a0 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  OpenJournal );. 
238b0 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65     rc = winGetTe
238c0 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54  mpname(pVfs, &zT
238d0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
238e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
238f0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
23900 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
23910 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d  rc=%s", zUtf8Nam
23920 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
23930 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
23940 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23950 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20      zUtf8Name = 
23960 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
23970 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
23980 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c  enames are doubl
23990 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
239a0 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
239b0 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68  t.  ** URIs with
239c0 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
239d0 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
239e0 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
239f0 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
23a00 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
23a10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23a20 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f   (eType!=SQLITE_
23a30 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c  OPEN_MAIN_DB) ||
23a40 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23a50 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20  _OPEN_URI) ||.  
23a60 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73       zUtf8Name[s
23a70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23a80 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  Utf8Name)+1]==0 
23a90 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  );..  /* Convert
23aa0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
23ab0 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
23ac0 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
23ad0 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
23ae0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
23af0 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
23b00 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
23b10 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
23b20 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
23b30 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
23b40 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
23b50 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
23b60 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  MEM", zUtf8Name)
23b70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
23b80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
23b90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
23ba0 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
23bb0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
23bc0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
23bd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23be0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
23bf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
23c00 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
23c10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
23c20 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  DIR", zUtf8Name)
23c30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
23c40 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
23c50 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  DIR;.  }..  if( 
23c60 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
23c70 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
23c80 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
23c90 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
23ca0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
23cb0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
23cc0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
23cd0 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
23ce0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
23cf0 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
23d00 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
23d10 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72  file is .  ** cr
23d20 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
23d30 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
23d40 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
23d50 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a  ive access" .  *
23d60 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
23d70 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
23d80 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
23d90 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
23da0 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
23db0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
23dc0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
23dd0 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
23de0 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
23df0 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
23e00 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
23e10 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
23e20 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
23e30 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
23e40 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
23e50 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
23e60 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
23e70 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
23e80 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
23e90 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
23ea0 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
23eb0 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
23ec0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
23ed0 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
23ee0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
23ef0 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
23f00 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
23f10 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
23f20 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
23f30 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
23f40 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
23f50 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
23f60 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
23f70 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
23f80 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
23f90 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
23fa0 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
23fb0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
23fc0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
23fd0 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
23fe0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
24010 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_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 7c 20 46 49 4c 45 5f 46          | FILE_F
24040 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
24050 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
24060 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
24070 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
24080 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
24090 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
240a0 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
240b0 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
240c0 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
240d0 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
240e0 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
240f0 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
24100 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
24110 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
24120 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
24130 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
24140 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
24150 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
24160 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
24170 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
24180 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
24190 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f      CREATEFILE2_
241a0 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
241b0 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61  ERS extendedPara
241c0 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65  meters;.    exte
241d0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
241e0 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43  wSize = sizeof(C
241f0 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
24200 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b  DED_PARAMETERS);
24210 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
24220 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74  ameters.dwFileAt
24230 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20  tributes =.     
24240 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
24250 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
24260 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
24270 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
24280 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
24290 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41  Flags = dwFlagsA
242a0 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
242b0 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20  ILE_FLAG_MASK;. 
242c0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
242d0 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79  eters.dwSecurity
242e0 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52  QosFlags = SECUR
242f0 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20  ITY_ANONYMOUS;. 
24300 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
24310 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79  eters.lpSecurity
24320 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c  Attributes = NUL
24330 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  L;.    extendedP
24340 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c  arameters.hTempl
24350 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  ateFile = NULL;.
24360 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
24370 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c  osCreateFile2((L
24380 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
24390 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243b0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
243c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
243f0 20 20 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 64 77 43 72 65             dwCre
24410 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
24420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74  &extendedParamet
24450 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ers))==INVALID_H
24460 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
24470 20 20 20 20 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 77 69 6e               win
24490 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
244a0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244c0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
244d0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
244e0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
244f0 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
24500 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
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 64 77 44 65 73 69 72 65 64         dwDesired
24530 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
24560 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, 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 64 77 43 72 65 61 74 69 6f         dwCreatio
24590 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
245c0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
245d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
24600 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
24630 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
24640 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
24650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24660 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
24670 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
24680 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
24690 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
246a0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
246b0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
246c0 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
246d0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
24730 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
24760 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
24790 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
247a0 20 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 4e 55 4c 4c 29 29            NULL))
247c0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
247d0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _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 77 69 6e 52 65 74 72 79          winRetry
24800 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
24810 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
24820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
24830 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  p */.    }.  }.#
24840 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f  endif.  winLogIo
24850 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54  err(cnt);..  OST
24860 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
24870 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
24880 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c  cess=%lx, rc=%s\
24890 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65  n", h, zUtf8Name
248a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44  ,.           dwD
248b0 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68  esiredAccess, (h
248c0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
248d0 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
248e0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
248f0 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
24900 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
24910 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
24920 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
24930 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
24940 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
24950 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
24960 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a  no, "winOpen", z
24970 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73  Utf8Name);.    s
24980 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24990 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
249a0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
249b0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  me);.    if( isR
249c0 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
249d0 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
249e0 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
249f0 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
24a00 2c 20 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c  , .         ((fl
24a10 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags|SQLITE_OPEN_
24a20 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20  READONLY) &.    
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   ~(SQLITE_OPEN_C
24a50 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  REATE|SQLITE_OPE
24a60 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20  N_READWRITE)),. 
24a70 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67          pOutFlag
24a80 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
24a90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24aa0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
24ab0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
24ac0 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
24ad0 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
24ae0 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f  ite ){.      *pO
24af0 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
24b00 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
24b10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
24b30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24b40 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
24b50 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24b60 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
24b70 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 70  s, access=%lx, p
24b80 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f  OutFlags=%p, *pO
24b90 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20  utFlags=%d, ".  
24ba0 20 20 20 20 20 20 20 20 20 22 72 63 3d 25 73 5c           "rc=%s\
24bb0 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65  n", h, zUtf8Name
24bc0 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  , dwDesiredAcces
24bd0 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f  s, pOutFlags, pO
24be0 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20 20 20  utFlags ?.      
24bf0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
24c00 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44  : 0, (h==INVALID
24c10 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f  _HANDLE_VALUE) ?
24c20 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
24c30 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
24c40 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69  OS_WINCE.  if( i
24c50 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65 54  sReadWrite && eT
24c60 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
24c70 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20  _MAIN_DB.       
24c80 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72  && (rc = winceCr
24c90 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20  eateLock(zName, 
24ca0 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f  pFile))!=SQLITE_
24cb0 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c  OK.  ){.    osCl
24cc0 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20  oseHandle(h);.  
24cd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24ce0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
24cf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
24d00 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
24d10 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f  ACE(("OPEN-CE-LO
24d20 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  CK name=%s, rc=%
24d30 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c  s\n", zName, sql
24d40 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
24d50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
24d60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
24d70 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
24d80 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
24d90 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
24da0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
24db0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24dc0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
24dd0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
24de0 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
24df0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
24e00 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20   &winIoMethod;. 
24e10 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
24e20 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  Vfs;.  pFile->h 
24e30 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61  = h;.  if( isRea
24e40 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69  donly ){.    pFi
24e50 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
24e60 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b   WINFILE_RDONLY;
24e70 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
24e80 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
24e90 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51  Name, "psow", SQ
24ea0 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
24eb0 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
24ec0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
24ed0 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f  s |= WINFILE_PSO
24ee0 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  W;.  }.  pFile->
24ef0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
24f00 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a  RROR;.  pFile->z
24f10 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69  Path = zName;.#i
24f20 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
24f30 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65  P_SIZE>0.  pFile
24f40 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
24f50 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
24f60 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  on = 0;.  pFile-
24f70 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
24f80 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
24f90 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46  Actual = 0;.  pF
24fa0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
24fb0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
24fc0 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23  Config.szMmap;.#
24fd0 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75  endif..  OpenCou
24fe0 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
24ff0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25000 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
25010 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   file..**.** Not
25020 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64  e that Windows d
25030 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
25040 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
25050 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
25060 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20  .** process has 
25070 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69  it open.  Someti
25080 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e  mes a virus scan
25090 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20  ner or indexing 
250a0 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20  program.** will 
250b0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
250c0 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65  ile shortly afte
250d0 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  r it is created 
250e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a  in order to do.*
250f0 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f  * whatever it do
25100 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20  es.  While this 
25110 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
25120 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20   holding the.** 
25130 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69  file open, we wi
25140 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ll be unable to 
25150 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77  delete it.  To w
25160 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a  ork around this.
25170 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ** problem, we d
25180 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65  elay 100 millise
25190 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f  conds and try to
251a0 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20   delete again.  
251b0 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45  Up.** to MX_DELE
251c0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65  TION_ATTEMPTs de
251d0 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  letion attempts 
251e0 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67  are run before g
251f0 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20  iving.** up and 
25200 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
25210 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
25220 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73  t winDelete(.  s
25230 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25240 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
25250 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
25260 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25270 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
25280 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
25290 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
252a0 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20  int syncDir     
252b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
252c0 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
252d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74   */.){.  int cnt
252e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
252f0 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
25300 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
25310 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  = 0;.  void *zCo
25320 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
25330 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
25340 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
25350 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
25360 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
25370 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
25380 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
25390 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
253a0 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63  TE name=%s, sync
253b0 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65  Dir=%d\n", zFile
253c0 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b  name, syncDir));
253d0 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ..  zConverted =
253e0 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
253f0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
25400 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
25410 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
25420 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c     OSTRACE(("DEL
25430 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
25440 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25450 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  EM\n", zFilename
25460 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
25470 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25480 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
25490 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20  sNT() ){.    do 
254a0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
254b0 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33  WINRT.      WIN3
254c0 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
254d0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
254e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73  .      memset(&s
254f0 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
25500 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
25510 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65  .      if ( osGe
25520 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
25530 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47  xW(zConverted, G
25540 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
25550 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
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 26 73 41 74 74 72 44 61          &sAttrDa
25580 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ta) ){.        a
25590 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
255a0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
255b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
255c0 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
255d0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
255e0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
255f0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
25600 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
25610 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
25620 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
25630 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
25640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
25660 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
25670 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
25680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25690 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
256a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
256b0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
256c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  k;.      }.#else
256d0 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
256e0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
256f0 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sW(zConverted);.
25700 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
25710 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
25720 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
25730 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
25740 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
25750 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
25760 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
25770 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
25780 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
25790 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
257a0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
257b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
257c0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
257d0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
257e0 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
257f0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
25800 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25810 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25840 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46       if ( attr&F
25850 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
25860 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20  RECTORY ){.     
25870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
25880 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f  RROR; /* Files o
25890 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nly. */.        
258a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
258b0 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65       if ( osDele
258c0 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74  teFileW(zConvert
258d0 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ed) ){.        r
258e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
258f0 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f  * Deleted OK. */
25900 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25920 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72   ( !winRetryIoer
25930 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25940 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
25950 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25960 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
25970 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
25980 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25990 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
259a0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
259b0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
259c0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20  .  else{.    do 
259d0 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  {.      attr = o
259e0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
259f0 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esA(zConverted);
25a00 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
25a10 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  ==INVALID_FILE_A
25a20 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20  TTRIBUTES ){.   
25a30 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
25a40 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
25a50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
25a60 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
25a70 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
25a80 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
25a90 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
25aa0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
25ab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25ac0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
25ad0 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
25ae0 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
25af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25b00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25b10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
25b20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
25b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25b40 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54  f ( attr&FILE_AT
25b50 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
25b60 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  Y ){.        rc 
25b70 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
25b80 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a  /* Files only. *
25b90 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
25ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25bb0 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  f ( osDeleteFile
25bc0 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  A(zConverted) ){
25bd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25be0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65  LITE_OK; /* Dele
25bf0 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
25c00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25c10 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69  }.      if ( !wi
25c20 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
25c30 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
25c40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25c50 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e  LITE_ERROR; /* N
25c60 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20  o more retries. 
25c70 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
25c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
25c90 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65  while(1);.  }.#e
25ca0 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26 26  ndif.  if( rc &&
25cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
25cc0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
25cd0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
25ce0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
25cf0 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74  ERR_DELETE, last
25d00 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74  Errno, "winDelet
25d10 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  e", zFilename);.
25d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e    }else{.    win
25d30 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  LogIoerr(cnt);. 
25d40 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
25d50 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25d60 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
25d70 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  E name=%s, rc=%s
25d80 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
25d90 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
25da0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
25db0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
25dc0 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  k the existence 
25dd0 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
25de0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
25df0 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
25e00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
25e10 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
25e20 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
25e30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
25e40 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
25e50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
25e60 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
25e70 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
25e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
25e90 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
25ea0 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
25eb0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ed0 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
25ee0 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
25ef0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
25f00 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
25f10 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
25f20 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
25f30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
25f40 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
25f50 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
25f60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
25f70 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  ESS; );.  OSTRAC
25f80 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
25f90 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52  %s, flags=%x, pR
25fa0 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20  esOut=%p\n",.   
25fb0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
25fc0 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  e, flags, pResOu
25fd0 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  t));..  zConvert
25fe0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
25ff0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
26000 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
26010 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
26020 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
26030 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
26040 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
26050 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
26060 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
26070 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
26080 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
26090 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
260a0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
260b0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
260c0 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
260d0 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
260e0 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
260f0 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
26100 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
26110 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
26120 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
26130 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
26140 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
26170 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20  ndard, .        
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
261a0 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
261b0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
261c0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
261d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
261e0 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
261f0 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
26200 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
26210 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
26220 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
26230 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
26240 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
26250 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
26260 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
26270 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
26280 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
26290 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20  High==0 .       
262a0 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
262b0 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
262c0 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
262d0 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
262e0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
262f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26300 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
26310 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
26320 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
26330 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c  else{.      winL
26340 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
26350 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
26360 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o!=ERROR_FILE_NO
26370 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45  T_FOUND && lastE
26380 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48  rrno!=ERROR_PATH
26390 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
263a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
263b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
263c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
263d0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
263e0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
263f0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
26400 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20  ccess",.        
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
26430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26440 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
26450 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
26460 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
26470 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
26480 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
26490 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
264a0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
264b0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
264c0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
264d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
264e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
264f0 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
26500 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
26510 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
26520 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
26530 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
26540 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
26550 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
26560 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
26570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26580 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
26590 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
265a0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
265b0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
265c0 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
265d0 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
265e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
265f0 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
26600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
26610 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
26620 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
26630 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
26640 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
26650 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
26660 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
26670 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
26680 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
26690 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
266a0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
266b0 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
266c0 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
266d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
266e0 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
266f0 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
26700 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74  ied path name st
26710 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
26720 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c  e letter.** foll
26730 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20  owed by a colon 
26740 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
26750 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
26760 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
26770 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
26780 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
26790 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65   return ( sqlite
267a0 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
267b0 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
267c0 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d  ame[1]==':' );.}
267d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
267e0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
267f0 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
26800 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
26810 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
26820 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
26830 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
26840 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
26850 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
26860 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
26870 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
26880 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
26890 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
268a0 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
268b0 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
268c0 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
268d0 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
268e0 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
268f0 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
26900 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
26910 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
26920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26930 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
26940 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
26950 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
26960 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
26970 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
26980 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
26990 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
269a0 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
269b0 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
269c0 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
269d0 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
269e0 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
269f0 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
26a00 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
26a10 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
26a20 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
26a30 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
26a40 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
26a50 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
26a60 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
26a70 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
26a80 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
26a90 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
26aa0 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
26ab0 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
26ac0 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
26ad0 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b  irSep(zPathname[
26ae0 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0]) ){.    retur
26af0 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
26b00 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
26b10 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
26b20 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
26b30 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
26b40 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
26b50 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
26b60 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
26b70 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
26b80 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
26b90 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
26ba0 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
26bb0 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
26bc0 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
26bd0 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
26be0 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
26bf0 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
26c00 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76    if ( winIsDriv
26c10 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
26c20 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20  zPathname) ){.  
26c30 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
26c40 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
26c50 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
26c60 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
26c70 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
26c80 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
26c90 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
26ca0 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
26cb0 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
26cc0 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
26cd0 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
26ce0 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
26cf0 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
26d00 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
26d10 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
26d20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
26d30 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
26d40 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
26d50 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
26d60 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
26d70 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
26d80 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
26d90 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
26da0 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
26db0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
26dc0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
26dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
26de0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
26df0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
26e00 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
26e10 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
26e20 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
26e30 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
26e40 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
26e50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26e60 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
26e70 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
26e80 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ea0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
26eb0 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69  /.){.  .#if defi
26ec0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
26ed0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
26ee0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
26ef0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
26f00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
26f10 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ll);.  assert( n
26f20 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61  Full>=pVfs->mxPa
26f30 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28  thname );.  if (
26f40 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
26f50 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
26f60 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
26f70 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
26f80 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
26f90 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
26fa0 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
26fb0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
26fc0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
26fd0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
26fe0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
26ff0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
27000 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
27010 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
27020 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
27030 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
27040 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
27050 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
27060 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
27070 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
27080 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a  ry and a slash..
27090 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
270a0 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
270b0 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
270c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
270d0 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
270e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
270f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27100 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
27110 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
27120 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
27130 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
27140 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
27150 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
27160 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _A) |.          
27170 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20    CCP_RELATIVE, 
27180 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
27190 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
271a0 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  e+1)<0 ){.      
271b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
271c0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
271d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
271e0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
271f0 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
27200 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
27220 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
27230 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
27250 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
27260 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
27270 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20  ename(zOut);.   
27280 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
27290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
272a0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
272b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
272c0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
272d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
272e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
272f0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
27300 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
27310 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
27340 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
27350 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74  GetDirSep(), zUt
27360 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
27370 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
27380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27390 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
273a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
273b0 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
273c0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
273d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
273e0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
273f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27410 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
27420 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
27430 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
27440 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
27450 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
27460 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
27470 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20  IN_A),.         
27480 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f     zRelative, zO
27490 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ut, pVfs->mxPath
274a0 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20  name+1)<0 ){.   
274b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
274c0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74  zOut);.      ret
274d0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
274e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
274f0 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
27500 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
27530 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
27540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27550 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
27560 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
27570 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a  Filename(zOut);.
27580 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
27590 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
275a0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
275b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
275c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
275d0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
275e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
275f0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
27600 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
27610 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74  zFull, "%s", zUt
27620 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
27630 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
27640 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27650 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
27660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
27670 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
27680 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57  #if (SQLITE_OS_W
27690 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
276a0 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66  S_WINRT) && !def
276b0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
276c0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
276d0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
276e0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20  E_ERROR );.  /* 
276f0 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e  WinCE has no con
27700 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69  cept of a relati
27710 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20  ve pathname, or 
27720 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f  so I am told. */
27730 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20  .  /* WinRT has 
27740 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72  no way to conver
27750 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  t a relative pat
27760 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  h to an absolute
27770 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20   one. */.  if ( 
27780 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
27790 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
277a0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
277b0 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
277c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
277d0 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
277e0 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
277f0 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
27800 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
27810 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
27820 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
27830 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
27840 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
27850 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
27860 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
27870 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
27880 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
27890 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
278a0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
278b0 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
278c0 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
278d0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
278e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
278f0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
27900 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
27910 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
27940 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
27950 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
27960 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tive);.  }else{.
27970 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
27980 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
27990 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
279a0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
279b0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a  zRelative);.  }.
279c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
279d0 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
279e0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
279f0 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
27a00 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
27a10 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44  (__CYGWIN__).  D
27a20 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f  WORD nByte;.  vo
27a30 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
27a40 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
27a50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
27a60 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
27a70 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
27a80 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
27a90 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
27aa0 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
27ab0 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
27ac0 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
27ad0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
27ae0 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
27af0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
27b00 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69  AndColon(zRelati
27b10 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65  ve+1) ){.    zRe
27b20 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  lative++;.  }.. 
27b30 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
27b40 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
27b50 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
27b60 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
27b70 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
27b80 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
27b90 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
27ba0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
27bb0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
27bc0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
27bd0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
27be0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
27bf0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
27c00 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
27c10 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
27c20 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
27c30 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
27c40 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
27c50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
27c60 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
27c70 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
27c80 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
27c90 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
27ca0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
27cb0 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
27cc0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
27cd0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27ce0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
27cf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
27d00 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
27d10 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
27d20 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
27d30 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
27d40 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
27d50 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
27d60 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
27d70 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
27d80 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
27d90 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
27da0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
27db0 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
27dc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
27dd0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
27de0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27df0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
27e00 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
27e10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27e20 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
27e30 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
27e40 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
27e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27e60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76  _OK;.  }.  zConv
27e70 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
27e80 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
27e90 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  me(zRelative);. 
27ea0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
27eb0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
27ec0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27ed0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
27ee0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c  sIsNT() ){.    L
27ef0 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
27f00 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
27f10 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
27f20 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
27f30 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
27f40 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
27f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27f60 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27f70 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
27f80 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
27f90 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
27fa0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
27fb0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
27fd0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c  nFullPathname1",
27fe0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
27ff0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
28000 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
28010 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
28020 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
28030 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
28040 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
28050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28060 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28070 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28080 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
28090 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
280a0 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
280b0 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
280c0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
280d0 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
280e0 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
280f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28100 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28120 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
28130 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28140 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28150 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
28160 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
28170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28180 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
28190 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52  llPathname2", zR
281a0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
281b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
281c0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
281d0 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
281e0 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29  odeToUtf8(zTemp)
281f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28200 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
28210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
28220 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
28230 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
28240 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
28250 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
28260 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
28270 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
28280 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
28290 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
282a0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
282b0 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
282c0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
282d0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
282e0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
282f0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
28320 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame3", zRelative
28330 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
28340 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
28350 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
28360 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
28370 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
28380 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
28390 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
283a0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
283b0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
283c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
283d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
283e0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
283f0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
28400 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
28410 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
28420 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
28430 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28440 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28450 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
28460 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
28470 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
28480 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28490 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
284a0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
284b0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
284d0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22  inFullPathname4"
284e0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
284f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
28500 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28510 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c  ;.    zOut = sql
28520 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
28530 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
28540 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28550 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e  (zTemp);.  }.#en
28560 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29  dif.  if( zOut )
28570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
28580 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
28590 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
285a0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
285b0 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
285c0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
285d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
285e0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
285f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28600 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
28610 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66   }.#endif.}..#if
28620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28630 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
28640 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
28650 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
28660 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
28670 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
28680 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
28690 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
286a0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
286b0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
286c0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ..*/./*.** Inter
286d0 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
286e0 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
286f0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
28700 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
28710 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
28720 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
28730 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
28740 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  brary..*/.static
28750 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e   void *winDlOpen
28760 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
28770 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
28780 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41  zFilename){.  HA
28790 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a  NDLE h;.  void *
287a0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
287b0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
287c0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
287d0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
287e0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
287f0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
28800 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28810 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  0;.  }.  if( osI
28820 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
28830 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
28840 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
28850 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
28860 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
28870 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
28880 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
28890 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
288a0 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
288b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
288c0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
288d0 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
288e0 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
288f0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
28900 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
28910 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28920 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
28930 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
28940 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
28950 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
28960 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
28970 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
28980 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28990 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69  ETER(pVfs);.  wi
289a0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
289b0 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
289c0 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  ), nBuf, zBufOut
289d0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
289e0 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69   (*winDlSym(sqli
289f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f  te3_vfs *pVfs,vo
28a00 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61  id *pH,const cha
28a10 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  r *zSym))(void){
28a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28a30 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
28a40 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
28a50 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72  d))osGetProcAddr
28a60 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c  essA((HANDLE)pH,
28a70 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
28a80 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65   void winDlClose
28a90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
28aa0 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
28ab0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
28ac0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
28ad0 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48  osFreeLibrary((H
28ae0 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
28af0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
28b00 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
28b10 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
28b20 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
28b30 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
28b40 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
28b50 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
28b60 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
28b70 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
28b80 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  e 0.#endif.../*.
28b90 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
28ba0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
28bb0 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
28bc0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
28bd0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
28be0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28bf0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
28c00 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e   *zBuf){.  int n
28c10 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
28c20 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
28c30 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
28c40 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e  TE_TEST).  n = n
28c50 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42  Buf;.  memset(zB
28c60 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65  uf, 0, nBuf);.#e
28c70 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
28c80 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42  (SYSTEMTIME)<=nB
28c90 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54  uf-n ){.    SYST
28ca0 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73  EMTIME x;.    os
28cb0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78  GetSystemTime(&x
28cc0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
28cd0 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65  Buf[n], &x, size
28ce0 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(x));.    n +=
28cf0 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a   sizeof(x);.  }.
28d00 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
28d10 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
28d20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f     DWORD pid = o
28d30 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
28d40 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ssId();.    memc
28d50 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69  py(&zBuf[n], &pi
28d60 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
28d70 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
28d80 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53  (pid);.  }.#if S
28d90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
28da0 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e   if( sizeof(ULON
28db0 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29  GLONG)<=nBuf-n )
28dc0 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20  {.    ULONGLONG 
28dd0 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
28de0 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65  ount64();.    me
28df0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
28e00 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
28e10 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
28e20 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c  of(cnt);.  }.#el
28e30 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
28e40 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
28e50 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20  {.    DWORD cnt 
28e60 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
28e70 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
28e80 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
28e90 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
28ea0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
28eb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
28ec0 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45  if( sizeof(LARGE
28ed0 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d  _INTEGER)<=nBuf-
28ee0 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  n ){.    LARGE_I
28ef0 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
28f00 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
28f10 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
28f20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
28f30 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29  , &i, sizeof(i))
28f40 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
28f50 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  f(i);.  }.#endif
28f60 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
28f70 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
28f80 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
28f90 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
28fa0 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
28fb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
28fc0 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
28fd0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
28fe0 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71   microsec){.  sq
28ff0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
29000 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29  p((microsec+999)
29010 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44  /1000);.  UNUSED
29020 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29030 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63  ;.  return ((mic
29040 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
29050 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *1000;.}../*.** 
29060 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
29070 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
29080 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
29090 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
290a0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
290b0 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
290c0 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
290d0 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
290e0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
290f0 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
29100 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
29110 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
29120 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
29130 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
29140 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
29150 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
29160 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
29170 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
29180 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
29190 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
291a0 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
291b0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
291c0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
291d0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
291e0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
291f0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
29200 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
29210 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
29220 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
29230 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
29240 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
29250 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
29260 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
29270 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
29280 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
29290 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
292a0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
292b0 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
292c0 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
292d0 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
292e0 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
292f0 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
29300 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
29310 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a   time and date .
29320 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
29330 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
29340 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
29350 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
29360 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
29370 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
29380 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
29390 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
293a0 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
293b0 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
293c0 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e  r of .     100-n
293d0 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76  anosecond interv
293e0 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72  als since Januar
293f0 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20  y 1, 1601 (= JD 
29400 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a  2305813.5). .  *
29410 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b  /.  FILETIME ft;
29420 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
29430 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69  sqlite3_int64 wi
29440 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d  nFiletimeEpoch =
29450 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74   23058135*(sqlit
29460 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
29470 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
29480 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f  TEST.  static co
29490 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
294a0 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
294b0 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
294c0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
294d0 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20  endif.  /* 2^32 
294e0 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f  - to avoid use o
294f0 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67  f LL and warning
29500 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74  s in gcc */.  st
29510 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
29520 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69  e3_int64 max32Bi
29530 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20  tValue = .      
29540 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
29550 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
29560 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
29570 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73  00000 +.      (s
29580 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
29590 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
295a0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
295b0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
295c0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
295d0 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
295e0 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
295f0 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
29600 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
29610 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
29620 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
29630 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
29640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29650 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
29660 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
29670 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
29680 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
29690 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
296a0 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
296b0 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
296c0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
296d0 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
296e0 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20  32BitValue) + . 
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
29700 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
29710 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28  dwLowDateTime)/(
29720 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30  sqlite3_int64)10
29730 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  000;..#ifdef SQL
29740 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
29750 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
29760 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
29770 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
29780 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
29790 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
297a0 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
297b0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
297c0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
297d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
297e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  K;.}../*.** Find
297f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
29800 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
29810 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
29820 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
29830 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
29840 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
29850 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
29860 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
29870 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
29880 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
29890 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
298a0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
298b0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
298c0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
298d0 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
298e0 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
298f0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
29900 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
29910 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
29920 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
29930 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
29940 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
29950 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
29960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29970 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
29980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
29990 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
299a0 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
299b0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
299c0 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
299d0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20   on Windows (or 
299e0 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
299f0 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69  error_r() on Uni
29a00 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
29a10 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
29a20 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
29a30 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
29a40 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
29a50 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
29a60 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
29a70 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
29a80 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
29a90 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
29aa0 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
29ab0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
29ac0 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
29ad0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
29ae0 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
29af0 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
29b00 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
29b10 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
29b20 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
29b30 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
29b40 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
29b50 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
29b60 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
29b70 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
29b80 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
29b90 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
29ba0 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
29bb0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
29bc0 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
29bd0 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
29be0 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
29bf0 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
29c00 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
29c10 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
29c20 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
29c30 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
29c40 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
29c50 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
29c60 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
29c70 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
29c80 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
29c90 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
29ca0 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
29cb0 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
29cc0 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
29cd0 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
29ce0 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
29cf0 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
29d00 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
29d10 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
29d20 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
29d30 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
29d40 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
29d50 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
29d60 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
29d70 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
29d80 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
29d90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
29da0 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
29db0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
29dc0 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
29dd0 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
29de0 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
29df0 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
29e00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
29e10 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
29e20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
29e30 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
29e40 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
29e50 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
29e60 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
29e70 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
29e80 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
29e90 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
29ea0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
29eb0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
29ec0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
29ed0 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74  eturn winGetLast
29ee0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
29ef0 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
29f00 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
29f10 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
29f20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
29f30 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
29f40 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
29f50 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
29f60 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
29f70 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
29f80 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
29f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29fa0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
29fb0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
29fc0 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
29fd0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
29fe0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
29ff0 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2a000 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2a010 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a020 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2a030 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
2a040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
2a050 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2a080 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2a090 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2a0a0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2a0b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2a0c0 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
2a0d0 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
2a0e0 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2a0f0 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2a100 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
2a110 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2a120 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2a130 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2a140 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2a150 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2a160 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2a170 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2a180 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2a190 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2a1a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2a1b0 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2a1c0 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2a1d0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2a1e0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2a1f0 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2a200 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
2a210 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
2a220 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2a230 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2a240 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2a250 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2a260 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2a270 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
2a280 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2a290 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2a2a0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2a2b0 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2a2c0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2a2d0 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2a2e0 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2a2f0 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2a300 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
2a310 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2a320 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e  /.  };.#if defin
2a330 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2a340 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74  HAS_WIDE).  stat
2a350 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77  ic sqlite3_vfs w
2a360 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20  inLongPathVfs = 
2a370 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2a380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2a390 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2a3a0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2a3b0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2a3c0 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2a3d0 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
2a3e0 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2a3f0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a410 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2a420 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20  n32-longpath",  
2a430 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2a440 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2a450 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2a460 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2a470 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2a480 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2a490 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2a4a0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2a4b0 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2a4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2a4d0 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2a4e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2a4f0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2a500 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2a510 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2a520 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2a530 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2a540 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2a550 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2a560 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
2a570 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2a580 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2a590 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2a5a0 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2a5b0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2a5c0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2a5d0 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2a5e0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2a5f0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2a600 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
2a610 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2a620 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2a630 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
2a640 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
2a650 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2a660 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
2a670 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2a680 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2a690 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
2a6a0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2a6b0 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2a6c0 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
2a6d0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2a6e0 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2a6f0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2a700 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65  mCall */.  };.#e
2a710 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c  ndif..  /* Doubl
2a720 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
2a730 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
2a740 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
2a750 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
2a760 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
2a770 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
2a780 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
2a790 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
2a7a0 79 73 63 61 6c 6c 29 3d 3d 37 36 20 29 3b 0a 0a  yscall)==76 );..
2a7b0 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20    /* get memory 
2a7c0 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67  map allocation g
2a7d0 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20  ranularity */.  
2a7e0 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e  memset(&winSysIn
2a7f0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59  fo, 0, sizeof(SY
2a800 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66  STEM_INFO));.#if
2a810 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2a820 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  .  osGetNativeSy
2a830 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
2a840 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f  Info);.#else.  o
2a850 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26  sGetSystemInfo(&
2a860 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e  winSysInfo);.#en
2a870 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77 69  dif.  assert( wi
2a880 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
2a890 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
2a8a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2a8b0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
2a8c0 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71  eSize>0 );..  sq
2a8d0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
2a8e0 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
2a8f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2a900 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2a910 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  DE).  sqlite3_vf
2a920 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c  s_register(&winL
2a930 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a  ongPathVfs, 0);.
2a940 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
2a950 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
2a960 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
2a970 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20 53  nd(void){ .#if S
2a980 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2a990 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e   if( sleepObj!=N
2a9a0 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  ULL ){.    osClo
2a9b0 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62  seHandle(sleepOb
2a9c0 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a  j);.    sleepObj
2a9d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e   = NULL;.  }.#en
2a9e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
2a9f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
2aa00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
2aa10 49 4e 20 2a 2f 0a                                IN */.