/ Hex Artifact Content
Login

Artifact 70e5fd4b931d9e4ed2395683503cc253be705192:


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 20 20 53 51 4c 69 74 65 54 68 72 65 61  if.  SQLiteThrea
2180: 64 20 2a 70 72 65 43 61 63 68 65 54 68 72 65 61  d *preCacheThrea
2190: 64 3b 20 2f 2a 20 54 68 72 65 61 64 20 75 73 65  d; /* Thread use
21a0: 64 20 74 6f 20 70 72 65 2d 63 61 63 68 65 20 66  d to pre-cache f
21b0: 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  ile contents */.
21c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
21d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e  d values for win
21e0: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a  File.ctrlFlags.*
21f0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
2200: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20  E_RDONLY        
2210: 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e    0x02   /* Conn
2220: 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f  ection is read o
2230: 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  nly */.#define W
2240: 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
2250: 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  AL     0x04   /*
2260: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2270: 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  mode */.#define 
2280: 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20  WINFILE_PSOW    
2290: 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f          0x10   /
22a0: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
22b0: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
22c0: 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65  TE */../*. * The
22d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
22e0: 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69  fer used by sqli
22f0: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
2300: 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66  debug().. */.#if
2310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2320: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23  2_DBG_BUF_SIZE.#
2330: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2340: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
2350: 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36  ZE   ((int)(4096
2360: 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29  -sizeof(DWORD)))
2370: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2380: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69  he value used wi
2390: 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  th sqlite3_win32
23a0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29  _set_directory()
23b0: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74   to specify that
23c0: 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72  . * the data dir
23d0: 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  ectory should be
23e0: 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69   changed.. */.#i
23f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2400: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
2410: 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65  Y_TYPE.#  define
2420: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41   SQLITE_WIN32_DA
2430: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
2440: 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  E (1).#endif../*
2450: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2460: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2470: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
2480: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
2490: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d   that. * the tem
24a0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
24b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
24c0: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
24d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
24e0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
24f0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2500: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
2510: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a  ECTORY_TYPE (2).
2520: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66  #endif../*. * If
2530: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
2540: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
2550: 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  OC on Windows, w
2560: 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20  e will use the. 
2570: 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20  * various Win32 
2580: 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f  API heap functio
2590: 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75  ns instead of ou
25a0: 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65  r own.. */.#ifde
25b0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
25c0: 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20  ALLOC../*. * If 
25d0: 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  this is non-zero
25e0: 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65  , an isolated he
25f0: 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  ap will be creat
2600: 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65  ed by the native
2610: 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61   Win32. * alloca
2620: 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f  tor subsystem; o
2630: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65  therwise, the de
2640: 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65  fault process he
2650: 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  ap will be used.
2660: 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e    This. * settin
2670: 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  g has no effect 
2680: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66  when compiling f
2690: 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65  or WinRT.  By de
26a0: 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65  fault, this is e
26b0: 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e  nabled. * and an
26c0: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
26d0: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74  ill be created t
26e0: 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f  o store all allo
26f0: 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20  cated data.. *. 
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2750: 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73  * WARNING: It is
2760: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
2770: 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
2780: 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e  s setting is non
2790: 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a  -zero and the. *
27a0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d            winMem
27b0: 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  Shutdown functio
27c0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67  n is called (e.g
27d0: 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  . by the sqlite3
27e0: 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20  _shutdown. *    
27f0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c        function),
2800: 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77   all data that w
2810: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  as allocated usi
2820: 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  ng the isolated 
2830: 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20  heap will. *    
2840: 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69        be freed i
2850: 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61  mmediately and a
2860: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  ny attempt to ac
2870: 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74  cess any of that
2880: 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20   freed. *       
2890: 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d     data will alm
28a0: 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65  ost certainly re
28b0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64  sult in an immed
28c0: 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c  iate access viol
28d0: 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ation.. ********
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64  ******. */.#ifnd
2930: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2940: 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64  HEAP_CREATE.#  d
2950: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2960: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20  32_HEAP_CREATE  
2970: 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a    (TRUE).#endif.
2980: 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69  ./*. * The initi
2990: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  al size of the W
29a0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65  in32-specific he
29b0: 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ap.  This value 
29c0: 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f  may be zero.. */
29d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29e0: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
29f0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
2a00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2a10: 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c  _INIT_SIZE ((SQL
2a20: 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
2a30: 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20  E_SIZE) * \.    
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55     (SQLITE_DEFAU
2a70: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20  LT_PAGE_SIZE) + 
2a80: 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a  4194304).#endif.
2a90: 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d  ./*. * The maxim
2aa0: 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  um size of the W
2ab0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65  in32-specific he
2ac0: 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ap.  This value 
2ad0: 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f  may be zero.. */
2ae0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2af0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
2b00: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
2b10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2b20: 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65  MAX_SIZE  (0).#e
2b30: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2b40: 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75  extra flags to u
2b50: 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74  se in calls to t
2b60: 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50  he Win32 heap AP
2b70: 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  Is.  This value 
2b80: 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66  may be. * zero f
2b90: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62  or the default b
2ba0: 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66  ehavior.. */.#if
2bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2bc0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20  2_HEAP_FLAGS.#  
2bd0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2be0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20  N32_HEAP_FLAGS  
2bf0: 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a     (0).#endif...
2c00: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d  /*.** The winMem
2c10: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73  Data structure s
2c20: 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tores informatio
2c30: 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  n required by th
2c40: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2c50: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  .** sqlite3_mem_
2c60: 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e  methods implemen
2c70: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
2c80: 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ef struct winMem
2c90: 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b  Data winMemData;
2ca0: 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61  .struct winMemDa
2cb0: 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ta {.#ifndef NDE
2cc0: 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31  BUG.  u32 magic1
2cd0: 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d  ;   /* Magic num
2ce0: 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74  ber to detect st
2cf0: 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69  ructure corrupti
2d00: 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  on. */.#endif.  
2d10: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a  HANDLE hHeap; /*
2d20: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f   The handle to o
2d30: 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f  ur heap. */.  BO
2d40: 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44  OL bOwned;  /* D
2d50: 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61  o we own the hea
2d60: 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20  p (i.e. destroy 
2d70: 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f  it on shutdown)?
2d80: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
2d90: 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b  UG.  u32 magic2;
2da0: 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62     /* Magic numb
2db0: 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72  er to detect str
2dc0: 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
2dd0: 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  n. */.#endif.};.
2de0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2df0: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
2e00: 41 47 49 43 31 20 20 20 20 20 30 78 34 32 62 32  AGIC1     0x42b2
2e10: 38 33 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e  830b.#define WIN
2e20: 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30  MEM_MAGIC2     0
2e30: 78 62 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66  xbd4d7cf4.#endif
2e40: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
2e50: 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d  winMemData win_m
2e60: 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e  em_data = {.#ifn
2e70: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e  def NDEBUG.  WIN
2e80: 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64  MEM_MAGIC1,.#end
2e90: 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45  if.  NULL, FALSE
2ea0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2eb0: 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32    ,WINMEM_MAGIC2
2ec0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e  .#endif.};..#ifn
2ed0: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
2ee0: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
2ef0: 61 67 69 63 31 28 29 20 61 73 73 65 72 74 28 20  agic1() assert( 
2f00: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67  win_mem_data.mag
2f10: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
2f20: 43 31 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e  C1 ).#define win
2f30: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28  MemAssertMagic2(
2f40: 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65  ) assert( win_me
2f50: 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57  m_data.magic2==W
2f60: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23  INMEM_MAGIC2 ).#
2f70: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
2f80: 65 72 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d  ertMagic()  winM
2f90: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29  emAssertMagic1()
2fa0: 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  ; winMemAssertMa
2fb0: 67 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64  gic2();.#else.#d
2fc0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2fd0: 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66  rtMagic().#endif
2fe0: 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ..#define winMem
2ff0: 47 65 74 44 61 74 61 50 74 72 28 29 20 20 26 77  GetDataPtr()  &w
3000: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66  in_mem_data.#def
3010: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
3020: 70 28 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f  p()     win_mem_
3030: 64 61 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69  data.hHeap.#defi
3040: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  ne winMemGetOwne
3050: 64 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64  d()    win_mem_d
3060: 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74  ata.bOwned..stat
3070: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
3080: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
3090: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
30a0: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
30b0: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
30c0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
30d0: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
30e0: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
30f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
3100: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
3110: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
3120: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
3130: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
3140: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
3150: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
3160: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
3170: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
3180: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
3190: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
31a0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
31b0: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
31c0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
31d0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
31e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
31f0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
3200: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
3210: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
3220: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
3230: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
3240: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
3250: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3260: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
3270: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
3280: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
3290: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
32a0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
32b0: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
32c0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
32d0: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
32e0: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
32f0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
3300: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
3310: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
3320: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
3330: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
3340: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
3350: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
3360: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3370: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3380: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
3390: 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
33a0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
33b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c  TE_OS_WINRT && \
33c0: 0a 20 20 20 20 20 20 64 65 66 69 6e 65 64 28 53  .      defined(S
33d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
33e0: 41 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64  ANSI) && defined
33f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3400: 53 5f 57 49 44 45 29 0a 73 74 61 74 69 63 20 69  S_WIDE).static i
3410: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
3420: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
3430: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
3440: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
3450: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
3460: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a  l_ptr.#endif../*
3470: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3480: 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  n is not availab
3490: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
34a0: 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a   or WinRT.. */..
34b0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
34c0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
34d0: 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65  _WINRT.#  define
34e0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
34f0: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e  SI()       1.#en
3500: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20  dif../*.** Many 
3510: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65  system calls are
3520: 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67   accessed throug
3530: 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e  h pointer-to-fun
3540: 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a  ctions so that.*
3550: 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76  * they may be ov
3560: 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74  erridden at runt
3570: 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ime to facilitat
3580: 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  e fault injectio
3590: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  n during.** test
35a0: 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69  ing and sandboxi
35b0: 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ng.  The followi
35c0: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74  ng array holds t
35d0: 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69  he names and poi
35e0: 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20  nters.** to all 
35f0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
3600: 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74  tem calls..*/.st
3610: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f  atic struct win_
3620: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
3630: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
3640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3650: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
3660: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
3670: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
3680: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
3690: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
36a0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
36b0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
36c0: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
36d0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
36e0: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
36f0: 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  = {.#if !SQLITE_
3700: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
3710: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
3720: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
3730: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
3740: 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73  CALL)AreFileApis
3750: 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20  ANSI,         0 
3760: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72  },.#else.  { "Ar
3770: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
3780: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3790: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
37a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
37b0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
37c0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
37d0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
37e0: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
37f0: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
3800: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
3810: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
3820: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3830: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
3840: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3850: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f  IDE).  { "CharLo
3860: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
3870: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
3880: 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20  rLowerW,        
3890: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
38a0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
38b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
38c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
38f0: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77  define osCharLow
3900: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
3910: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
3920: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
3930: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3940: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
3950: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3960: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3970: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
3980: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3990: 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20  LL)CharUpperW,  
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
39b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
39c0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
39d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
39e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
39f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3a00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3a10: 68 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53  harUpperW ((LPWS
3a20: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
3a30: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  TR))aSyscall[2].
3a40: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3a50: 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20  CloseHandle",   
3a60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a70: 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20  LL)CloseHandle, 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3a90: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ..#define osClos
3aa0: 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57  eHandle ((BOOL(W
3ab0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
3ac0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
3ad0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3ae0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3af0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43  HAS_ANSI).  { "C
3b00: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
3b10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3b20: 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20  L)CreateFileA,  
3b30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3b40: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3b50: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
3b60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3b90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3ba0: 65 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44  eateFileA ((HAND
3bb0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
3bc0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  TR,DWORD,DWORD, 
3bd0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
3be0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
3bf0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44  DWORD,DWORD,HAND
3c00: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  LE))aSyscall[4].
3c10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c20: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3c30: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3c40: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3c50: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3c60: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3c70: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3c80: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
3c90: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3ca0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3cc0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3ce0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3cf0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3d00: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3d10: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
3d20: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
3d30: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
3d40: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
3d50: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
3d60: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
3d70: 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45  t)..#if (!SQLITE
3d80: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
3d90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3da0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c  2_HAS_ANSI) && \
3db0: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
3dc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3dd0: 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  L)).  { "CreateF
3de0: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
3df0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3e00: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20  teFileMappingA, 
3e10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3e20: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
3e30: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
3e40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3e70: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3e80: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e  leMappingA ((HAN
3e90: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
3ea0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
3eb0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
3ec0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
3ed0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61  ,DWORD,LPCSTR))a
3ee0: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
3ef0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3f00: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
3f10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3f20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3f30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3f40: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
3f50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3f60: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72  IT_WAL)).  { "Cr
3f70: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3f80: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3f90: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
3fa0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
3fb0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3fc0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
3fd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4000: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
4010: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
4020: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4030: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
4040: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
4050: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
4060: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
4070: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
4080: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4090: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
40a0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
40b0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
40c0: 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  E).  { "CreateMu
40d0: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
40e0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
40f0: 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20  eMutexW,        
4100: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4110: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4120: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4130: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4160: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74  fine osCreateMut
4170: 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  exW ((HANDLE(WIN
4180: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
4190: 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c  _ATTRIBUTES,BOOL
41a0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57  , \.        LPCW
41b0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  STR))aSyscall[8]
41c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
41d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
41e0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
41f0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
4200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4210: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
4220: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
4230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4240: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4290: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28   osDeleteFileA (
42a0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
42b0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
42c0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
42d0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
42e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
42f0: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
4300: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
4310: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4320: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
4330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4340: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4390: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57  ne osDeleteFileW
43a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
43b0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
43c0: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
43d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
43e0: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
43f0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
4400: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69  me", (SYSCALL)Fi
4410: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
4420: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
4430: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
4440: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4450: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4480: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
4490: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
44a0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
44b0: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
44c0: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
44d0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
44e0: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
44f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4500: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4510: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
4520: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c      (SYSCALL)Fil
4530: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4540: 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  e,    0 },.#else
4550: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4560: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4570: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
45a0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
45b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28  eToSystemTime ((
45c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
45d0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
45e0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
45f0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
4600: 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  12].pCurrent).. 
4610: 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66   { "FlushFileBuf
4620: 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53  fers",        (S
4630: 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65  YSCALL)FlushFile
4640: 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20  Buffers,        
4650: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4660: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
4670: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4680: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
4690: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
46a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
46b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
46c0: 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  SI).  { "FormatM
46d0: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
46e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
46f0: 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20  atMessageA,     
4700: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4710: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4720: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
4730: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4760: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
4770: 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57  ssageA ((DWORD(W
4780: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4790: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
47a0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
47b0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
47c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  *))aSyscall[14].
47d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
47e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
47f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4800: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
4810: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
4820: 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73  SCALL)FormatMess
4830: 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30  ageW,          0
4840: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4850: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
4860: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4870: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4880: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4890: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
48a0: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
48b0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
48c0: 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c  )(DWORD,LPCVOID,
48d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53  DWORD,DWORD,LPWS
48e0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
48f0: 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53  ORD,va_list*))aS
4900: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
4910: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4920: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
4930: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
4940: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
4950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4960: 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61  YSCALL)FreeLibra
4970: 72 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ry,             
4980: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4990: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
49a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
49b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
49d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
49e0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
49f0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4a00: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
4a10: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
4a20: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
4a30: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
4a40: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
4a50: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
4a60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4a70: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
4a80: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
4a90: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
4aa0: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
4ab0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4ac0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4ad0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4ae0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4af0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4b00: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
4b10: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
4b20: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
4b30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
4b40: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
4b50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4b90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4ba0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4bb0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
4bc0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4bd0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4be0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
4bf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4c00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4c10: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
4c20: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4c30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4c40: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
4c50: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
4c60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4c70: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c80: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
4c90: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
4ca0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
4cb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4ce0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
4cf0: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
4d00: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4d10: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
4d20: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
4d30: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
4d40: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
4d50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4d60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4d70: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4d80: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4d90: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
4da0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
4db0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
4dc0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4dd0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
4de0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4df0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4e00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4e20: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4e30: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
4e40: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4e50: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
4e60: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4e70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4e80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4e90: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4ea0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4eb0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4ec0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4ed0: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
4ee0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4ef0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
4f00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4f30: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4f40: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f50: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4f60: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4f70: 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e  call[21].pCurren
4f80: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4f90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4fa0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
4fb0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4fc0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
4fd0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4fe0: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
4ff0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
5000: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5010: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5040: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5050: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
5060: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5070: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
5080: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
5090: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
50a0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
50b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
50c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
50d0: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
50e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
50f0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
5100: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5110: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5120: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5130: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5140: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5150: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5160: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5170: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
5180: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5190: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
51a0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
51b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
51c0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
51d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
51e0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
51f0: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5200: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
5210: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
5220: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
5230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5240: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5250: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5290: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
52a0: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
52b0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
52c0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
52d0: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
52e0: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
52f0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5300: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
5310: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5320: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5330: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
5340: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5350: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
5360: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
5370: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
5380: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5390: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
53a0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
53b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
53c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
53d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
53e0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
53f0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
5400: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
5410: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
5420: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
5430: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
5440: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
5450: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
5460: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5470: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
5480: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5490: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
54a0: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
54b0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
54c0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
54d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
54e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
54f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53  EXTENSION).#if S
5500: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5510: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
5520: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
5530: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
5540: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
5550: 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  E. */.  { "GetPr
5560: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
5570: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5580: 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20  tProcAddressA,  
5590: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
55a0: 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
55b0: 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   Windows platfor
55c0: 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
55d0: 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
55e0: 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20  ke.  ** an ANSI 
55f0: 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
5600: 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
5610: 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b  E setting */.  {
5620: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5630: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5640: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
5650: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20  ess,          0 
5660: 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  },.#endif.#else.
5670: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5680: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5690: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
56c0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
56d0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
56e0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
56f0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
5700: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
5710: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
5720: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5730: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
5740: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
5750: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
5760: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
5770: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5780: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
5790: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
57a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
57d0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
57e0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
57f0: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
5800: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d  FO))aSyscall[28]
5810: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5820: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
5830: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5840: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
5850: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
5860: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
5870: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
5880: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
5890: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
58a0: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
58b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
58c0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
58d0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
58e0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
58f0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5900: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
5910: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5920: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
5930: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5960: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5970: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5980: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
5990: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
59a0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
59b0: 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[30].pCurrent).
59c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
59e0: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
59f0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
5a00: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5a10: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
5a20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a30: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5a40: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
5a50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a80: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5a90: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
5aa0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
5ab0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e  R))aSyscall[31].
5ac0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5ad0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5ae0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5af0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5b00: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
5b10: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
5b20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
5b30: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
5b40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5b50: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
5b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5b70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5ba0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
5bb0: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
5bc0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
5bd0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70  ))aSyscall[32].p
5be0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5bf0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5c00: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
5c10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5c20: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
5c30: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
5c40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5c50: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
5c60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5c70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5c90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5ca0: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
5cb0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cc0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5cd0: 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  33].pCurrent)..#
5ce0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5cf0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5d00: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5d10: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5d20: 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20  SIONEX) && \.   
5d30: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
5d40: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20  2_GETVERSIONEX. 
5d50: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
5d60: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
5d70: 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f  YSCALL)GetVersio
5d80: 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20  nExA,           
5d90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5da0: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
5db0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5dc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5de0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5df0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
5e00: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5e10: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53  ( \.        LPOS
5e20: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53  VERSIONINFOA))aS
5e30: 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72  yscall[34].pCurr
5e40: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5e50: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5e60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5e70: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
5e80: 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  \.        define
5e90: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
5ea0: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20  ETVERSIONEX) && 
5eb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5ec0: 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47  VERSIONEX.  { "G
5ed0: 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20  etVersionExW",  
5ee0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ef0: 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c  L)GetVersionExW,
5f00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5f10: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65  #else.  { "GetVe
5f20: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
5f30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5f60: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5f70: 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f  tVersionExW ((BO
5f80: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5f90: 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49         LPOSVERSI
5fa0: 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c  ONINFOW))aSyscal
5fb0: 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[35].pCurrent).
5fc0: 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22  .  { "HeapAlloc"
5fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fe0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c  (SYSCALL)HeapAll
5ff0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6000: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6010: 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50  osHeapAlloc ((LP
6020: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
6030: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
6040: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6050: 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72  yscall[36].pCurr
6060: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6070: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6080: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
6090: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
60a0: 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20  LL)HeapCreate,  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
60c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
60d0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
60e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
60f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6100: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6110: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6120: 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44  eapCreate ((HAND
6130: 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  LE(WINAPI*)(DWOR
6140: 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20  D,SIZE_T, \.    
6150: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6160: 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e  call[37].pCurren
6170: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6180: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6190: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
61a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
61b0: 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20  )HeapDestroy,   
61c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
61d0: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65  else.  { "HeapDe
61e0: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
61f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6220: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
6230: 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28  pDestroy ((BOOL(
6240: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
6250: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
6260: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
6270: 61 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  apFree",        
6280: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6290: 29 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20  )HeapFree,      
62a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
62b0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72  #define osHeapFr
62c0: 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ee ((BOOL(WINAPI
62d0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
62e0: 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  LPVOID))aSyscall
62f0: 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [39].pCurrent)..
6300: 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63    { "HeapReAlloc
6310: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c  SYSCALL)HeapReAl
6330: 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  loc,            
6340: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6350: 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c  sHeapReAlloc ((L
6360: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6370: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
6380: 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  ID, \.        SI
6390: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
63a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
63b0: 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20  { "HeapSize",   
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
63d0: 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20  SCALL)HeapSize, 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
63f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
6400: 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54  eapSize ((SIZE_T
6410: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6420: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6430: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
6440: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
6450: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6460: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6470: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
6480: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6490: 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20  HeapValidate,   
64a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
64b0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  lse.  { "HeapVal
64c0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
64d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6500: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6510: 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28  Validate ((BOOL(
6520: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6530: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6540: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6550: 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[42].pCurrent)
6560: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6570: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6580: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6590: 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20  HeapCompact",   
65a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65b0: 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  LL)HeapCompact, 
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
65d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
65e0: 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20  Compact",       
65f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6610: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6620: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6630: 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e  eapCompact ((UIN
6640: 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  T(WINAPI*)(HANDL
6650: 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  E,DWORD))aSyscal
6660: 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[43].pCurrent).
6670: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6680: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6690: 53 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  SI) && !defined(
66a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
66b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
66c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
66d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
66e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
66f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6700: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6710: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
6720: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6730: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6740: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6750: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6760: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
6770: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6780: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
6790: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
67a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
67b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
67c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
67d0: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
67e0: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
67f0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
6800: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6810: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
6820: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6830: 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20  )LoadLibraryW,  
6840: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6850: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6860: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6870: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
68a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
68b0: 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44  dLibraryW ((HMOD
68c0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
68d0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  WSTR))aSyscall[4
68e0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
68f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6900: 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  RT.  { "LocalFre
6910: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6920: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c    (SYSCALL)Local
6930: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
6940: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6950: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6970: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
69a0: 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65  fine osLocalFree
69b0: 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49   ((HLOCAL(WINAPI
69c0: 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63  *)(HLOCAL))aSysc
69d0: 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74  all[46].pCurrent
69e0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
69f0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
6a00: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6a10: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
6a20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6a30: 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20  ALL)LockFile,   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
6a60: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6a70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6a80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6a90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6aa0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
6ab0: 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  LockFile.#define
6ac0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
6ad0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6ae0: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6af0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6b00: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6b10: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  47].pCurrent).#e
6b20: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
6b30: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
6b40: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
6b50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b60: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  LL)LockFileEx,  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6b80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6b90: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6ba0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6bc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6bd0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6be0: 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e  ockFileEx.#defin
6bf0: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28  e osLockFileEx (
6c00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c10: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6c20: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6c30: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6c40: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6c50: 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  48].pCurrent).#e
6c60: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
6c70: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
6c80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
6c90: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6ca0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
6cb0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
6cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6cd0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
6ce0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  le,           0 
6cf0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
6d00: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
6d10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6d20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6d30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6d40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6d50: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  sMapViewOfFile (
6d60: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6d70: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6d80: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6d90: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6da0: 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65  scall[49].pCurre
6db0: 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42  nt)..  { "MultiB
6dc0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20  yteToWideChar", 
6dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c      (SYSCALL)Mul
6de0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
6df0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
6e00: 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  ine osMultiByteT
6e10: 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28  oWideChar ((int(
6e20: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
6e30: 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c  ORD,LPCSTR,int,L
6e40: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
6e50: 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35   int))aSyscall[5
6e60: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
6e70: 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61  { "QueryPerforma
6e80: 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59  nceCounter", (SY
6e90: 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f  SCALL)QueryPerfo
6ea0: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30  rmanceCounter, 0
6eb0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51   },..#define osQ
6ec0: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6ed0: 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49  ounter ((BOOL(WI
6ee0: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
6ef0: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a    LARGE_INTEGER*
6f00: 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70  ))aSyscall[51].p
6f10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52  Current)..  { "R
6f20: 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20  eadFile",       
6f30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6f40: 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20  L)ReadFile,     
6f50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6f60: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46  .#define osReadF
6f70: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6f80: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49  I*)(HANDLE,LPVOI
6f90: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
6fa0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6fb0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6fc0: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
6fd0: 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69  .  { "SetEndOfFi
6fe0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
6ff0: 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f  (SYSCALL)SetEndO
7000: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
7010: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7020: 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28  osSetEndOfFile (
7030: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7040: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
7050: 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  53].pCurrent)..#
7060: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7070: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
7080: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
7090: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
70a0: 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20  ilePointer,     
70b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
70c0: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
70d0: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
70e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7110: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
7120: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
7130: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7140: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
7150: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
7160: 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e  call[54].pCurren
7170: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
7180: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c  OS_WINRT.  { "Sl
7190: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
71a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
71b0: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
71c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
71d0: 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22  else.  { "Sleep"
71e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7220: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65  f..#define osSle
7230: 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  ep ((VOID(WINAPI
7240: 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61  *)(DWORD))aSysca
7250: 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[55].pCurrent)
7260: 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d  ..  { "SystemTim
7270: 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20  eToFileTime",   
7280: 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d   (SYSCALL)System
7290: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20  TimeToFileTime, 
72a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
72b0: 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46   osSystemTimeToF
72c0: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
72d0: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59  INAPI*)(CONST SY
72e0: 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  STEMTIME*, \.   
72f0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
7300: 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43  )aSyscall[56].pC
7310: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
7320: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
7330: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7340: 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  T.  { "UnlockFil
7350: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
7360: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
7370: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
7380: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7390: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
73b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
73d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
73e0: 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  def osUnlockFile
73f0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
7400: 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  kFile ((BOOL(WIN
7410: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7420: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
7430: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
7440: 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43  )aSyscall[57].pC
7450: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
7460: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7470: 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INCE.  { "Unlock
7480: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
7490: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
74a0: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
74b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
74c0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
74d0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
74e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7510: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
7520: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
7530: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7540: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
7550: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
7560: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
7570: 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [58].pCurrent)..
7580: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7590: 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NCE || !defined(
75a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
75b0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
75c0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
75d0: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
75e0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
75f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7600: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
7610: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
7620: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7640: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7650: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
7660: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7670: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
7680: 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72  yscall[59].pCurr
7690: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
76a0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
76b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
76c0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
76d0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
76e0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
76f0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
7700: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
7710: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
7720: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
7730: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
7740: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30  OOL))aSyscall[60
7750: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7760: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
7770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7780: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
77a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
77b0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
77c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
77d0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
77e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
77f0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7800: 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72  yscall[61].pCurr
7810: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7820: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43  _OS_WINRT.  { "C
7830: 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20  reateEventExW", 
7840: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7850: 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  L)CreateEventExW
7860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
7870: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
7880: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
7890: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
78c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
78d0: 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48  eateEventExW ((H
78e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
78f0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
7900: 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a  UTES,LPCWSTR, \.
7910: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
7920: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32  ORD))aSyscall[62
7930: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7940: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7950: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7960: 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20  ngleObject",    
7970: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
7980: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20  rSingleObject,  
7990: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
79a0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
79b0: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
79c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
79e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
79f0: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
7a00: 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52  gleObject ((DWOR
7a10: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7a20: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  E, \.        DWO
7a30: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d  RD))aSyscall[63]
7a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7a50: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7a60: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7a70: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
7a80: 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d  eObjectEx,   0 }
7a90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  ,..#define osWai
7aa0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7ab0: 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Ex ((DWORD(WINAP
7ac0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
7ad0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c  , \.        BOOL
7ae0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70  ))aSyscall[64].p
7af0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7b00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7b10: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
7b20: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
7b30: 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69  SCALL)SetFilePoi
7b40: 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30  nterEx,        0
7b50: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
7b60: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22  etFilePointerEx"
7b70: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
7b80: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7b90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7ba0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7bb0: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
7bc0: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7bd0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f  *)(HANDLE,LARGE_
7be0: 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20  INTEGER, \.     
7bf0: 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45     PLARGE_INTEGE
7c00: 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  R,DWORD))aSyscal
7c10: 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[65].pCurrent).
7c20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7c30: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c  INRT.  { "GetFil
7c40: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7c50: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
7c60: 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  L)GetFileInforma
7c70: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20  tionByHandleEx, 
7c80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7c90: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
7ca0: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
7cb0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7cd0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7ce0: 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d   osGetFileInform
7cf0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20  ationByHandleEx 
7d00: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7d10: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
7d20: 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48    FILE_INFO_BY_H
7d30: 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f  ANDLE_CLASS,LPVO
7d40: 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  ID,DWORD))aSysca
7d50: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
7d60: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7d70: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
7d80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7d90: 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  L).  { "MapViewO
7da0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
7db0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
7dc0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c  ewOfFileFromApp,
7dd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7de0: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
7df0: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
7e00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7e30: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
7e40: 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50  FileFromApp ((LP
7e50: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
7e60: 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  NDLE,ULONG,ULONG
7e70: 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  64, \.        SI
7e80: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36  ZE_T))aSyscall[6
7e90: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
7ea0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7eb0: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  T.  { "CreateFil
7ec0: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
7ed0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
7ee0: 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20  File2,          
7ef0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7f00: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7f20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7f50: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
7f60: 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  2 ((HANDLE(WINAP
7f70: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
7f80: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7f90: 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54  .        LPCREAT
7fa0: 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
7fb0: 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73  PARAMETERS))aSys
7fc0: 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e  call[68].pCurren
7fd0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7fe0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
7ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8000: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
8010: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
8020: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
8030: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b  SYSCALL)LoadPack
8040: 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20  agedLibrary,    
8050: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8060: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
8070: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
8080: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
80a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
80b0: 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  e osLoadPackaged
80c0: 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c  Library ((HMODUL
80d0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
80e0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
80f0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39  ORD))aSyscall[69
8100: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8110: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8120: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
8130: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
8140: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
8150: 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20  Count64,        
8160: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8170: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
8180: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8190: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
81b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
81c0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
81d0: 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28  t64 ((ULONGLONG(
81e0: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
81f0: 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72  Syscall[70].pCur
8200: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8210: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8220: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8230: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
8240: 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74  LL)GetNativeSyst
8250: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c  emInfo,     0 },
8260: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e  .#else.  { "GetN
8270: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
8280: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
82a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
82b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
82c0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
82d0: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
82e0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
82f0: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
8300: 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65  scall[71].pCurre
8310: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
8320: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
8330: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74  S_ANSI).  { "Out
8340: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
8350: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8360: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8370: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
8380: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8390: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
83a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
83d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
83e0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28  utDebugStringA (
83f0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
8400: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
8410: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
8420: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8430: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
8440: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8450: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
8460: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8470: 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20  DebugStringW,   
8480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8490: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
84a0: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
84b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
84d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
84e0: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
84f0: 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28  gStringW ((VOID(
8500: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
8510: 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70  ))aSyscall[73].p
8520: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
8530: 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20  etProcessHeap", 
8540: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
8550: 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  L)GetProcessHeap
8560: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
8570: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
8580: 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44  ocessHeap ((HAND
8590: 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  LE(WINAPI*)(VOID
85a0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70  ))aSyscall[74].p
85b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
85c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
85d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
85e0: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22  _OMIT_WAL).  { "
85f0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8600: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
8610: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
8620: 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20  ppingFromApp, 0 
8630: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
8640: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8650: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
8660: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8670: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8680: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8690: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
86a0: 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44  ngFromApp ((HAND
86b0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
86c0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
86d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
86e0: 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  TES,ULONG,ULONG6
86f0: 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  4,LPCWSTR))aSysc
8700: 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74  all[75].pCurrent
8710: 29 0a 0a 20 20 7b 20 22 44 75 70 6c 69 63 61 74  )..  { "Duplicat
8720: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
8730: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 75 70 6c     (SYSCALL)Dupl
8740: 69 63 61 74 65 48 61 6e 64 6c 65 2c 20 20 20 20  icateHandle,    
8750: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
8760: 65 20 6f 73 44 75 70 6c 69 63 61 74 65 48 61 6e  e osDuplicateHan
8770: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
8780: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
8790: 20 20 20 20 20 20 48 41 4e 44 4c 45 2c 48 41 4e        HANDLE,HAN
87a0: 44 4c 45 2c 4c 50 48 41 4e 44 4c 45 2c 44 57 4f  DLE,LPHANDLE,DWO
87b0: 52 44 2c 42 4f 4f 4c 2c 44 57 4f 52 44 29 29 61  RD,BOOL,DWORD))a
87c0: 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72  Syscall[76].pCur
87d0: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
87e0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
87f0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
8800: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
8810: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
8820: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
8830: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
8840: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
8850: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
8860: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8870: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
8880: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
8890: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
88a0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
88b0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
88c0: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
88d0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
88e0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
88f0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
8900: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
8910: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
8920: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
8930: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
8940: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
8950: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8960: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
8970: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8980: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
8990: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
89a0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
89b0: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
89c0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
89d0: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
89e0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
89f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
8a00: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
8a10: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
8a20: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
8a30: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8a40: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
8a50: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
8a60: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
8a70: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
8a80: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
8a90: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
8aa0: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
8ab0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
8ac0: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
8ad0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8ae0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8af0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8b00: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
8b10: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
8b20: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
8b30: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
8b40: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
8b50: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
8b60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8b70: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
8b80: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
8b90: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
8ba0: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
8bb0: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
8bc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8bd0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8be0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8bf0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8c00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8c10: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
8c20: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
8c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
8c40: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8c50: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
8c60: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8c70: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
8c80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8c90: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
8ca0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8cb0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
8cc0: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
8cd0: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
8ce0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
8cf0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
8d00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
8d10: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
8d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8d40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8d50: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
8d60: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
8d70: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8d80: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8d90: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
8da0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8db0: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
8dc0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
8dd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
8de0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
8df0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
8e00: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
8e10: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
8e20: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
8e30: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
8e40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8e50: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
8e60: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
8e70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8e80: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
8e90: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8ea0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8eb0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8ec0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
8ed0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8ee0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
8ef0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
8f00: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
8f10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8f20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8f30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
8f40: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
8f50: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
8f60: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
8f70: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
8f80: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
8f90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
8fa0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
8fb0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
8fc0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
8fd0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
8fe0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
8ff0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9000: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
9020: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
9030: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
9040: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
9050: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
9060: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9070: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9080: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9090: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
90a0: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
90b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
90c0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
90d0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
90e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
90f0: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9100: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9110: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9120: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9130: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9140: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9150: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9160: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9170: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9180: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9190: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
91a0: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
91b0: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
91c0: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
91d0: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
91e0: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
91f0: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9200: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9210: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9220: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9230: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9240: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9250: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9260: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9270: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9280: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9290: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
92a0: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
92b0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
92c0: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
92d0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
92e0: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
92f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9300: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9310: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
9320: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
9330: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9340: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9350: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9360: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9370: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9380: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9390: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
93a0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
93b0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
93c0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
93d0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
93e0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
93f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9400: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9410: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9420: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9430: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9440: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9450: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9460: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9470: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9480: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9490: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
94a0: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
94b0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
94c0: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
94d0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
94e0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
94f0: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9500: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9520: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9530: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9540: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9550: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9580: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9590: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
95a0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
95b0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
95c0: 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  R, "failed to He
95d0: 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c  apCompact (%lu),
95e0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
9600: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9610: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9620: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
9640: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
9650: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46  _log(SQLITE_NOTF
9660: 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f  OUND, "failed to
9670: 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65   HeapCompact, he
9680: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9690: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
96a0: 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  ap);.  rc = SQLI
96b0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e  TE_NOTFOUND;.#en
96c0: 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67  dif.  if( pnLarg
96d0: 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74  est ) *pnLargest
96e0: 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72   = nLargest;.  r
96f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9700: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
9710: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
9720: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
9730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
9740: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
9750: 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72  destroy and recr
9760: 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65  eate it.  If the
9770: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9780: 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74  ap is not isolat
9790: 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65  ed and/or.** the
97a0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
97b0: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  used() function 
97c0: 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20  does not return 
97d0: 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53  zero, SQLITE_BUS
97e0: 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74  Y will.** be ret
97f0: 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61  urned and no cha
9800: 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
9810: 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e  e to the Win32 n
9820: 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69  ative heap..*/.i
9830: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
9840: 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20  _reset_heap(){. 
9850: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58   int rc;.  MUTEX
9860: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
9870: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
9880: 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74  ) /* The main st
9890: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
98a0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
98b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d  ite3_mutex *pMem
98c0: 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65  ; )    /* The me
98d0: 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65  msys static mute
98e0: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
98f0: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
9900: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9910: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9920: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
9930: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
9940: 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  em = sqlite3Mute
9950: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9960: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
9970: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
9980: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
9990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
99a0: 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a  ex_enter(pMem);.
99b0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
99c0: 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e  gic();.  if( win
99d0: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
99e0: 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f  LL && winMemGetO
99f0: 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65  wned() && sqlite
9a00: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9a10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9a20: 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
9a30: 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  t, there should 
9a40: 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
9a50: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
9a60: 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74  ions on.    ** t
9a70: 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20  he heap.  Also, 
9a80: 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d  since both the m
9a90: 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73  aster and memsys
9aa0: 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65   locks are curre
9ab0: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ntly.    ** bein
9ac0: 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f  g held by us, no
9ad0: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20   other function 
9ae0: 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68  (i.e. from anoth
9af0: 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c  er thread) shoul
9b00: 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65  d.    ** be able
9b10: 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20   to even access 
9b20: 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d  the heap.  Attem
9b30: 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e  pt to destroy an
9b40: 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20  d recreate our. 
9b50: 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57     ** isolated W
9b60: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9b70: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
9b80: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9b90: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9ba0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9bb0: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
9bc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9bd0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9be0: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69  d()==0 );.    wi
9bf0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e  nMemShutdown(win
9c00: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
9c10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9c20: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e  nMemGetHeap()==N
9c30: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9c40: 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  t( !winMemGetOwn
9c50: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9c60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9c70: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9c80: 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49      rc = winMemI
9c90: 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  nit(winMemGetDat
9ca0: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
9cb0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
9cc0: 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48  OK || winMemGetH
9cd0: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9cf0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
9d00: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a  emGetOwned() );.
9d10: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9d20: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
9d30: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9d40: 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ()==0 );.  }else
9d50: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9d60: 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  The Win32 native
9d70: 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20   heap cannot be 
9d80: 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65  modified because
9d90: 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73   it may be in us
9da0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
9db0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9dc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
9dd0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b  tex_leave(pMem);
9de0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9df0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
9e00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9e20: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9e30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9e40: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68  ction outputs th
9e50: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53  e specified (ANS
9e60: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  I) string to the
9e70: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a   Win32 debugger.
9e80: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  ** (if available
9e90: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69  )..*/..void sqli
9ea0: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
9eb0: 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72  debug(const char
9ec0: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66   *zBuf, int nBuf
9ed0: 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75  ){.  char zDbgBu
9ee0: 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f[SQLITE_WIN32_D
9ef0: 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20  BG_BUF_SIZE];.  
9f00: 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e  int nMin = MIN(n
9f10: 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e  Buf, (SQLITE_WIN
9f20: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
9f30: 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65  - 1)); /* may be
9f40: 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20   negative. */.  
9f50: 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d  if( nMin<-1 ) nM
9f60: 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20  in = -1; /* all 
9f70: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
9f80: 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20  become -1. */.  
9f90: 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31  assert( nMin==-1
9fa0: 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e   || nMin==0 || n
9fb0: 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32  Min<SQLITE_WIN32
9fc0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b  _DBG_BUF_SIZE );
9fd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
9fe0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
9ff0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
a000: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a010: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
a020: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a030: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a040: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a050: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
a060: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
a070: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
a080: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
a090: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
a0a0: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
a0b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a0c0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
a0d0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a0e0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a0f0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a100: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
a110: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
a120: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
a130: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a140: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
a150: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
a160: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
a170: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
a180: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a190: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
a1a0: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
a1b0: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
a1c0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
a1d0: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
a1e0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
a1f0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
a200: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a210: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a220: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
a230: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
a240: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
a250: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a260: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
a270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
a280: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a290: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
a2a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
a2b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a2c0: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
a2d0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
a2e0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
a2f0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
a300: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
a310: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
a320: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
a330: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
a340: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
a350: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
a360: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
a370: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
a380: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
a390: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
a3a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a3b0: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
a3c0: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
a3d0: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
a3e0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
a3f0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
a400: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
a410: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
a440: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a450: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
a460: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
a470: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
a480: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
a490: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
a4a0: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
a4b0: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
a4c0: 69 66 0a 7d 0a 0a 44 57 4f 52 44 20 73 71 6c 69  if.}..DWORD sqli
a4d0: 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e  te3Win32Wait(HAN
a4e0: 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20  DLE hObject){.  
a4f0: 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c  DWORD rc;.  whil
a500: 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46  e( (rc = osWaitF
a510: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
a520: 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49  (hObject, INFINI
a530: 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45 29             TRUE)
a560: 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c  )==WAIT_IO_COMPL
a570: 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75  ETION ){}.  retu
a580: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a590: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
a5a0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
a5b0: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
a5c0: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
a5d0: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
a5e0: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
a5f0: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
a600: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
a610: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
a620: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
a630: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
a640: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
a650: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
a660: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
a670: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
a680: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
a690: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
a6a0: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
a6b0: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
a6c0: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
a6d0: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
a6e0: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
a6f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
a700: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
a710: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
a720: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
a730: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
a740: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
a750: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a760: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
a770: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
a780: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a  leEx() API..*/..
a790: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a7a0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
a7b0: 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49  SIONEX) || !SQLI
a7c0: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
a7d0: 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f  IONEX.# define o
a7e0: 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c  sIsNT()  (1).#el
a7f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
a800: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
a810: 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65  WINRT || !define
a820: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a830: 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e  AS_ANSI).# defin
a840: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a  e osIsNT()  (1).
a850: 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53  #elif !defined(S
a860: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
a870: 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f  WIDE).# define o
a880: 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c  sIsNT()  (0).#el
a890: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  se.  static int 
a8a0: 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20  osIsNT(void){.  
a8b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73    if( sqlite3_os
a8c0: 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20  _type==0 ){.#if 
a8d0: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
a8e0: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
a8f0: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
a900: 5f 57 49 4e 38 0a 20 20 20 20 20 20 4f 53 56 45  _WIN8.      OSVE
a910: 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f  RSIONINFOW sInfo
a920: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
a930: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
a940: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
a950: 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65  );.      osGetVe
a960: 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29  rsionExW(&sInfo)
a970: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 4f 53  ;.#else.      OS
a980: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e  VERSIONINFOA sIn
a990: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
a9a0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
a9b0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
a9c0: 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74  fo);.      osGet
a9d0: 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66  VersionExA(&sInf
a9e0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  o);.#endif.     
a9f0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
aa00: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
aa10: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
aa20: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
aa30: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
aa40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
aa50: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
aa60: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
aa70: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
aa80: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
aa90: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
aaa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
aab0: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
aac0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
aad0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
aae0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
aaf0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
ab00: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
ab10: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
ab20: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
ab30: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
ab40: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
ab50: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
ab60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
ab70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ab80: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
ab90: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
aba0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
abb0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
abc0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
abd0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
abe0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
abf0: 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73  s>=0 );.  p = os
ac00: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
ac10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
ac20: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
ac30: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28  T)nBytes);.  if(
ac40: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
ac50: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ac60: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
ac70: 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74  HeapAlloc %u byt
ac80: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  es (%lu), heap=%
ac90: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
aca0: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
acb0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
acc0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
acd0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
ace0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
acf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
ad00: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
ad10: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
ad20: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
ad30: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
ad40: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
ad50: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
ad60: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
ad70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
ad80: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
ad90: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
ada0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
adb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
adc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
add0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
ade0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
adf0: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
ae00: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
ae10: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
ae20: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50  #endif.  if( !pP
ae30: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f  rior ) return; /
ae40: 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74  * Passing NULL t
ae50: 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e  o HeapFree is un
ae60: 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66  defined. */.  if
ae70: 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48  ( !osHeapFree(hH
ae80: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
ae90: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
aea0: 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  rior) ){.    sql
aeb0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
aec0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
aed0: 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b  o HeapFree block
aee0: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
aef0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
af00: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
af10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
af20: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
af30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
af40: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
af50: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
af60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
af70: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
af80: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
af90: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
afa0: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
afb0: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
afc0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
afd0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
afe0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
aff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b000: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
b010: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
b020: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
b030: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b040: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
b050: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
b060: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
b070: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
b080: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
b090: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b0a0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
b0b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
b0c0: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
b0d0: 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  ;.  if( !pPrior 
b0e0: 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  ){.    p = osHea
b0f0: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
b100: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b110: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
b120: 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Bytes);.  }else{
b130: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52  .    p = osHeapR
b140: 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  eAlloc(hHeap, SQ
b150: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b160: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28  FLAGS, pPrior, (
b170: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
b180: 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a    }.  if( !p ){.
b190: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b1a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b1b0: 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62  ailed to %s %u b
b1c0: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
b1d0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
b1e0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
b1f0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
b200: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
b210: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
b220: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
b230: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
b240: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
b250: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
b260: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
b270: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
b280: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
b290: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
b2a0: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
b2b0: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
b2c0: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
b2d0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
b2e0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b2f0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b300: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b310: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b320: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b340: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b350: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b360: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b370: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b380: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b390: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b3a0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b3b0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
b3c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
b3d0: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
b3e0: 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65    n = osHeapSize
b3f0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
b400: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
b410: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
b420: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
b430: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b440: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
b450: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
b460: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
b470: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
b480: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
b490: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
b4a0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
b4b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b4c0: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
b4d0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
b4e0: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
b4f0: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
b500: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
b510: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b520: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
b530: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
b540: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
b550: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
b560: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
b570: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
b580: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
b590: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
b5a0: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
b5b0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
b5c0: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
b5d0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
b5e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
b5f0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b600: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
b610: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
b620: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b630: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
b640: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69  EM_MAGIC2 );..#i
b650: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b660: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
b670: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20  32_HEAP_CREATE. 
b680: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
b690: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
b6a0: 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53  DWORD dwInitialS
b6b0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  ize = SQLITE_WIN
b6c0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
b6d0: 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d  E;.    DWORD dwM
b6e0: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57  aximumSize = (DW
b6f0: 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  ORD)sqlite3Globa
b700: 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20  lConfig.nHeap;. 
b710: 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d     if( dwMaximum
b720: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
b730: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d   dwMaximumSize =
b740: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b750: 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20  AP_MAX_SIZE;.   
b760: 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69   }else if( dwIni
b770: 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d  tialSize>dwMaxim
b780: 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  umSize ){.      
b790: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20  dwInitialSize = 
b7a0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20  dwMaximumSize;. 
b7b0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
b7c0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
b7d0: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
b7e0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b7f0: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74            dwInit
b820: 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d  ialSize, dwMaxim
b830: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  umSize);.    if(
b840: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
b850: 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Heap ){.      sq
b860: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b870: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
b880: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61    "failed to Hea
b890: 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66  pCreate (%lu), f
b8a0: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
b8b0: 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25  e=%lu, maxSize=%
b8c0: 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f  lu",.          o
b8d0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
b8e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b8f0: 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74  AP_FLAGS, dwInit
b900: 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ialSize,.       
b910: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
b920: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b930: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b940: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
b950: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
b960: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
b970: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
b980: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
b990: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
b9a0: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
b9b0: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
b9c0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
b9d0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
b9e0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b9f0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
ba00: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
ba10: 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c  cessHeap (%lu)",
ba20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
ba30: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
ba40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ba50: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
ba60: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
ba70: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
ba80: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
ba90: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
baa0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bab0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bac0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bad0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
bae0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
baf0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
bb00: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
bb10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
bb20: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
bb30: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
bb40: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
bb50: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
bb60: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bb70: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
bb80: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
bb90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bba0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
bbb0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bbc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
bbd0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
bbe0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
bbf0: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
bc00: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
bc10: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
bc20: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
bc30: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
bc40: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
bc50: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
bc60: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
bc70: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
bc80: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
bc90: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
bca0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
bcb0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
bcc0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bcd0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
bce0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
bcf0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
bd00: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
bd10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
bd20: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
bd40: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
bd50: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
bd60: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bd70: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
bd80: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
bd90: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bda0: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
bdb0: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
bdc0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
bdd0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
bde0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bdf0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
be00: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
be10: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
be20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
be40: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
be50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
be60: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
be70: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
be80: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
be90: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
bea0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
beb0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
bec0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
bed0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
bee0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
bef0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
bf00: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
bf10: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
bf20: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
bf30: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
bf40: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
bf50: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
bf60: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
bf70: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
bf80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bf90: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
bfa0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
bfb0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
bfc0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
bfd0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
bfe0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
bff0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
c000: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
c010: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
c020: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
c030: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
c040: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
c050: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
c060: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
c070: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
c080: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
c090: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
c0a0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
c0b0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
c0c0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
c0d0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
c0e0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
c0f0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
c100: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
c110: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
c120: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
c130: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
c140: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
c150: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
c160: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
c170: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c180: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
c190: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c1a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
c1b0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c1c0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
c1d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
c1e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
c1f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
c200: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
c210: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
c220: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
c230: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
c240: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
c250: 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
c260: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
c270: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
c280: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
c290: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
c2a0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
c2b0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
c2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c2d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
c2e0: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
c2f0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
c300: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
c310: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
c320: 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
c330: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
c340: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
c350: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
c360: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
c370: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
c380: 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
c390: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
c3c0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
c3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c3e0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
c3f0: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
c400: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
c410: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
c420: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
c430: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
c440: 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e  nicode to UTF-8.
c450: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
c460: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
c470: 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ing is.** obtain
c480: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
c490: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
c4a0: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
c4b0: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
c4c0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
c4d0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
c4e0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
c4f0: 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  e;..  nByte = os
c500: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
c510: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
c520: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
c530: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
c540: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
c550: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c560: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
c570: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
c580: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
c590: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
c5a0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c5b0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
c5c0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
c5d0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
c5e0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
c5f0: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
c600: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
c630: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
c640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c650: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
c660: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
c670: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c680: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
c690: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
c6a0: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
c6b0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
c6c0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
c6d0: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
c6e0: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
c6f0: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
c700: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
c710: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
c720: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
c730: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
c740: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
c750: 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73  c LPWSTR winMbcs
c760: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
c770: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c780: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
c790: 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c   LPWSTR zMbcsFil
c7a0: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64  ename;.  int cod
c7b0: 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c  epage = osAreFil
c7c0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
c7d0: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
c7e0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  ..  nByte = osMu
c7f0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c800: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
c810: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
c820: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43      0)*sizeof(WC
c850: 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  HAR);.  if( nByt
c860: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c870: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63  rn 0;.  }.  zMbc
c880: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  sFilename = sqli
c890: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
c8a0: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63  Byte*sizeof(zMbc
c8b0: 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  sFilename[0]) );
c8c0: 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65  .  if( zMbcsFile
c8d0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
c8e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
c8f0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
c900: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
c910: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
c920: 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69  ame, -1, zMbcsFi
c930: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a          nByte);.
c960: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
c970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c980: 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  ee(zMbcsFilename
c990: 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65  );.    zMbcsFile
c9a0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c9b0: 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65  return zMbcsFile
c9c0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
c9d0: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
c9e0: 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74   Unicode to mult
c9f0: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
ca00: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
ca10: 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20  n the.** user's 
ca20: 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a  ANSI codepage..*
ca30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
ca40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
ca50: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
ca60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
ca70: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
ca80: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
ca90: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50  UnicodeToMbcs(LP
caa0: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
cab0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
cac0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
cad0: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
cae0: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
caf0: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
cb00: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
cb10: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
cb20: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
cb30: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
cb40: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
cb50: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
cb60: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
cb70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cb80: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
cb90: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
cba0: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
cbb0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
cbc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cbd0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
cbe0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
cbf0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
cc00: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
cc10: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
cc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20   nByte, 0, 0);. 
cc50: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
cc60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
cc70: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
cc80: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
cc90: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
cca0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
ccb0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74  .** Convert mult
ccc0: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
ccd0: 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e  string to UTF-8.
cce0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
ccf0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  the.** returned 
cd00: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
cd10: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
cd20: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61  malloc()..*/.cha
cd30: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
cd40: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f  _mbcs_to_utf8(co
cd50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
cd60: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ame){.  char *zF
cd70: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c  ilenameUtf8;.  L
cd80: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
cd90: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
cda0: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a  nMbcsToUnicode(z
cdb0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
cdc0: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
cdd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cde0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
cdf0: 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  8 = winUnicodeTo
ce00: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
ce10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ce20: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
ce30: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
ce40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
ce50: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
ce60: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
ce70: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
ce80: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
ce90: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
cea0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
ceb0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cec0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
ced0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
cee0: 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  _mbcs(const char
cef0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
cf00: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
cf10: 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  bcs;.  LPWSTR zT
cf20: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
cf30: 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ide = winUtf8ToU
cf40: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
cf50: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
cf60: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
cf70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
cf80: 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55  enameMbcs = winU
cf90: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
cfa0: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
cfb0: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
cfc0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
cfd0: 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  nameMbcs;.}../*.
cfe0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cff0: 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64   sets the data d
d000: 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20  irectory or the 
d010: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
d020: 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ory based on.** 
d030: 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67  the provided arg
d040: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70  uments.  The typ
d050: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
d060: 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f  be 1 in order to
d070: 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   set the.** data
d080: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20   directory or 2 
d090: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
d0a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
d0b0: 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56  rectory.  The zV
d0c0: 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  alue.** argument
d0d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d0e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
d0f0: 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72   use.  The retur
d100: 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a  n value will be.
d110: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
d120: 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69  successful..*/.i
d130: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
d140: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44  _set_directory(D
d150: 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53  WORD type, LPCWS
d160: 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68  TR zValue){.  ch
d170: 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79  ar **ppDirectory
d180: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
d190: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
d1a0: 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  IT.  int rc = sq
d1b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
d1c0: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
d1d0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
d1e0: 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  .  if( type==SQL
d1f0: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
d200: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
d210: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
d220: 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61   = &sqlite3_data
d230: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65  _directory;.  }e
d240: 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51  lse if( type==SQ
d250: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
d260: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
d270: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
d280: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d  y = &sqlite3_tem
d290: 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  p_directory;.  }
d2a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
d2b0: 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d  rectory || type=
d2c0: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
d2d0: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
d2e0: 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74  E.          || t
d2f0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
d300: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
d310: 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73  _TYPE.  );.  ass
d320: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
d330: 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64  y || sqlite3Memd
d340: 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44  ebugHasType(*ppD
d350: 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50  irectory, MEMTYP
d360: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28  E_HEAP) );.  if(
d370: 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a   ppDirectory ){.
d380: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65      char *zValue
d390: 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66  Utf8 = 0;.    if
d3a0: 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c  ( zValue && zVal
d3b0: 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  ue[0] ){.      z
d3c0: 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55  ValueUtf8 = winU
d3d0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61  nicodeToUtf8(zVa
d3e0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
d3f0: 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29   zValueUtf8==0 )
d400: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d410: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d430: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
d440: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
d450: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
d460: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
d470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d480: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
d490: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
d4a0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
d4b0: 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74   value of winGet
d4c0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20  LastErrorMsg.** 
d4d0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
d4e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
d4f0: 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
d500: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
d510: 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
d520: 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
d530: 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61  uncated)..*/.sta
d540: 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
d550: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
d560: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
d570: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
d580: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
d590: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
d5a0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
d5b0: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
d5c0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
d5d0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
d5e0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
d5f0: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
d600: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
d610: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
d620: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
d630: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
d640: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
d650: 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
d660: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
d670: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
d680: 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f  TempWide[SQLITE_
d690: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
d6a0: 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64  _CHARS+1];.    d
d6b0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
d6c0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
d6d0: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
d6e0: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
d710: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
d740: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69           zTempWi
d7b0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
d7e0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a  X_ERRMSG_CHARS,.
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
d810: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54  .#else.    LPWST
d820: 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55  R zTempWide = NU
d830: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
d840: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
d850: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
d860: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
d870: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
d890: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
d8a0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
d8d0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
d8e0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
d930: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
d980: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20    0);.#endif.   
d9d0: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
d9e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
d9f0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
da00: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
da10: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
da20: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
da30: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
da40: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
da50: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
da60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
da70: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
da80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
da90: 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72  INRT.      /* fr
daa0: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
dab0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
dac0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
dad0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
dae0: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
daf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
db00: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
db10: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
db20: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
db30: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
db40: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
db50: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
db60: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
db70: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
dba0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
dbb0: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
dbe0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
dbf0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
dc80: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
dcd0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
dce0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
dcf0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
dd00: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
dd10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
dd20: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
dd30: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
dd40: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
dd50: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
dd60: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
dd70: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
dd80: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
dd90: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
dda0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
ddb0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
ddc0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
ddd0: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
dde0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
ddf0: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
de00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
de10: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
de20: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c  f, "OsError 0x%l
de30: 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72  x (%lu)", lastEr
de40: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
de50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
de60: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
de70: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
de80: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
de90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
dea0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
deb0: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
dec0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
ded0: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
dee0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
def0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
df00: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
df10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
df20: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
df30: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
df40: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
df50: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
df60: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
df70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
df80: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
df90: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
dfa0: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
dfb0: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
dfc0: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
dfd0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
dfe0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
dff0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
e000: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
e010: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
e020: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
e030: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
e040: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
e050: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
e060: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
e070: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
e080: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
e090: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
e0a0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e0b0: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
e0c0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
e0d0: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
e0e0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
e0f0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
e100: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
e110: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
e120: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
e130: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61  that.** failed a
e140: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
e150: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
e160: 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  th, if any..*/.#
e170: 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72  define winLogErr
e180: 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69  or(a,b,c,d)   wi
e190: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
e1a0: 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f  a,b,c,d,__LINE__
e1b0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ).static int win
e1c0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
e1d0: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
e200: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52  r code */.  DWOR
e210: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20  D lastErrno,    
e220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e230: 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20  in32 last error 
e240: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e250: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
e260: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e270: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
e280: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
e290: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2b0: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
e2c0: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
e2d0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
e300: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
e310: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
e320: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  */.){.  char zMs
e330: 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20  g[500];         
e340: 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e          /* Human
e350: 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20   readable error 
e360: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  text */.  int i;
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e390: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e3a0: 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77  zMsg[0] = 0;.  w
e3b0: 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
e3c0: 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a  g(lastErrno, siz
e3d0: 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29  eof(zMsg), zMsg)
e3e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ;.  assert( errc
e3f0: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
e400: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
e410: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
e420: 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69   for(i=0; zMsg[i
e430: 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ] && zMsg[i]!='\
e440: 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  r' && zMsg[i]!='
e450: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d  \n'; i++){}.  zM
e460: 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  sg[i] = 0;.  sql
e470: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
e480: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e  ,.      "os_win.
e490: 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25  c:%d: (%lu) %s(%
e4a0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
e4b0: 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f  iLine, lastErrno
e4c0: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
e4d0: 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zMsg.  );..  ret
e4e0: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
e4f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  /*.** The number
e500: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61   of times that a
e510: 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69   ReadFile(), Wri
e520: 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65  teFile(), and De
e530: 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69  leteFile().** wi
e540: 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f  ll be retried fo
e550: 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e  llowing a lockin
e560: 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62  g error - probab
e570: 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a  ly caused by .**
e580: 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77   antivirus softw
e590: 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69  are.  Also the i
e5a0: 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66  nitial delay bef
e5b0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65  ore the first re
e5c0: 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61  try..** The dela
e5d0: 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65  y increases line
e5e0: 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72  arly with each r
e5f0: 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  etry..*/.#ifndef
e600: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e610: 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69  ERR_RETRY.# defi
e620: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
e630: 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23  IOERR_RETRY 10.#
e640: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e650: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
e660: 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64  _RETRY_DELAY.# d
e670: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
e680: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
e690: 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73  ELAY 25.#endif.s
e6a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65  tatic int winIoe
e6b0: 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45  rrRetry = SQLITE
e6c0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
e6d0: 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  RY;.static int w
e6e0: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
e6f0: 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  y = SQLITE_WIN32
e700: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
e710: 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  AY;../*.** If a 
e720: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
e730: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
e740: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
e750: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
e760: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
e770: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
e780: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
e790: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
e7a0: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
e7b0: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
e7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e7d0: 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
e7e0: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
e7f0: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
e800: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
e810: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
e820: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
e830: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
e840: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
e850: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
e860: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e870: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d  0;.  }.  if( e==
e880: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
e890: 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  IED ||.      e==
e8a0: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
e8b0: 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d  TION ||.      e=
e8c0: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
e8d0: 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20  IOLATION ){.    
e8e0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
e8f0: 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72  eep(winIoerrRetr
e900: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
e910: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
e920: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
e930: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
e940: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
e950: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
e960: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e970: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
e980: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
e990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e9a0: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
e9b0: 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e  nRetry){.  if( n
e9c0: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
e9d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e9e0: 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64  IOERR, .      "d
e9f0: 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20  elayed %dms for 
ea00: 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e  lock/sharing con
ea10: 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69  flict",.      wi
ea20: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
ea30: 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b  *nRetry*(nRetry+
ea40: 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  1)/2.    );.  }.
ea50: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
ea60: 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
ea70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eaa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eab0: 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
eac0: 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
ead0: 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
eae0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
eaf0: 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
eb00: 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53  LTIME_API) || !S
eb10: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
eb20: 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54  TIME_API./*.** T
eb30: 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57  he MSVC CRT on W
eb40: 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f  indows CE may no
eb50: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
eb60: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
eb70: 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73  So.** create a s
eb80: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
eb90: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
eba0: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
ebb0: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
ebc0: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
ebd0: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
ebe0: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
ebf0: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
ec00: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
ec10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
ec20: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
ec30: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
ec40: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
ec50: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
ec60: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
ec70: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
ec80: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
ec90: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
eca0: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
ecb0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
ecc0: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
ecd0: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
ece0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
ecf0: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
ed00: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
ed10: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
ed20: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
ed30: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
ed40: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
ed50: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
ed60: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
ed70: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
ed80: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
ed90: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
eda0: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
edb0: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
edc0: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
edd0: 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  f..#define HANDL
ede0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
edf0: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
ee00: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
ee10: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
ee20: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
ee30: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
ee40: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
ee50: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
ee60: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
ee70: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
ee80: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
ee90: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
eea0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
eeb0: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
eec0: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
eed0: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
eee0: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
eef0: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
ef00: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
ef10: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
ef20: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ef30: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
ef40: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
ef50: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
ef60: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
ef70: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
ef80: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
ef90: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
efa0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
efb0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
efc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
efd0: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
efe0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
eff0: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
f000: 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
f010: 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
f020: 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
f030: 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
f040: 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
f050: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
f060: 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69  E;..  zName = wi
f070: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
f080: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
f090: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
f0a0: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
f0b0: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
f0c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
f0d0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  EM;.  }..  /* In
f0e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
f0f0: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
f100: 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
f110: 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
f120: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
f130: 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
f140: 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
f150: 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
f160: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
f170: 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
f180: 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
f190: 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
f1a0: 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
f1b0: 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
f1c0: 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
f1d0: 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
f1e0: 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
f1f0: 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
f200: 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
f210: 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
f220: 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
f230: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
f240: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
f250: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
f260: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
f270: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f280: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71  tError();.    sq
f290: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
f2a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
f2b0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
f2c0: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
f2d0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
f300: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
f310: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
f320: 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
f330: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
f340: 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
f350: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
f360: 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69  tex);.  .  /* Si
f370: 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nce the names of
f380: 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20   named mutexes, 
f390: 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65  semaphores, file
f3a0: 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72   mappings etc ar
f3b0: 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  e .  ** case-sen
f3c0: 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
f3d0: 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
f3e0: 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
f3f0: 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
f400: 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
f410: 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
f420: 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
f430: 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
f440: 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
f450: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
f460: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
f470: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
f480: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
f490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
f4c0: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
f4d0: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
f510: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
f520: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
f530: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
f540: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
f550: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
f560: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
f570: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
f580: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f590: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f5a0: 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d  if (lastErrno ==
f5b0: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
f5c0: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
f5d0: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
f5e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f5f0: 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Name);..  /* If 
f600: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
f610: 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65  making the share
f620: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c  d memory handle,
f630: 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66   map it. */.  if
f640: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
f650: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   ){.    pFile->s
f660: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
f670: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
f680: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
f690: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
f6a0: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
f6b0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
f6c0: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
f6d0: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
f6e0: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
f6f0: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
f700: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
f710: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
f720: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c  */.    if( !pFil
f730: 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20  e->shared ){.   
f740: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f750: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
f760: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
f770: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
f780: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
f790: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
f7b0: 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
f7c0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
f7d0: 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
f7e0: 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  ;.      osCloseH
f7f0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
f800: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69  ared);.      pFi
f810: 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55  le->hShared = NU
f820: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
f830: 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65   /* If shared me
f840: 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62  mory could not b
f850: 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  e created, then 
f860: 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  close the mutex 
f870: 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66  and fail */.  if
f880: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
f890: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  ==NULL ){.    if
f8a0: 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20  ( !bLogged ){.  
f8b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f8c0: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
f8d0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
f8e0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f8f0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f900: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f910: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
f920: 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e  teLock3", zFilen
f930: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67  ame);.      bLog
f940: 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ged = TRUE;.    
f950: 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  }.    winceMutex
f960: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
f970: 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
f980: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
f990: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
f9a0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
f9b0: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LL;.    return S
f9c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
f9d0: 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  .  .  /* Initial
f9e0: 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ize the shared m
f9f0: 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73  emory if we're s
fa00: 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20  upposed to */.  
fa10: 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20  if( bInit ){.   
fa20: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73   memset(pFile->s
fa30: 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  hared, 0, sizeof
fa40: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
fa50: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
fa60: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
fa70: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
fa80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fa90: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
faa0: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
fab0: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
fac0: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
fad0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
fae0: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
faf0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
fb00: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
fb10: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
fb20: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
fb30: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
fb40: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
fb50: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
fb60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
fb70: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
fb80: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
fb90: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
fba0: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
fbb0: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
fbc0: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
fbd0: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
fbe0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
fbf0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
fc00: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
fc10: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
fc20: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
fc30: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
fc40: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
fc50: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
fc60: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
fc70: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
fc80: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
fc90: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
fca0: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
fcb0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
fcc0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
fcd0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
fce0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fcf0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
fd00: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
fd10: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
fd20: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
fd30: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
fd40: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
fd50: 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
fd60: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
fd70: 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
fd80: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
fd90: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
fda0: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
fdb0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
fdc0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
fdd0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
fde0: 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c  x);    .    osCl
fdf0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
fe00: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
fe10: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
fe20: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
fe30: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
fe40: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
fe50: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
fe60: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
fe70: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
fe80: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
fe90: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
fea0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
feb0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
fec0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
fed0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
fee0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
fef0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
ff00: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
ff10: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
ff20: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
ff30: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
ff40: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
ff50: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
ff60: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
ff70: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
ff80: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
ff90: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
ffa0: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
ffb0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
ffc0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
ffd0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
ffe0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
fff0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
10000 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
10010 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
10020 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
10030 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
10040 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
10050 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
10060 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
10070 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
10080 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
10090 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
100a0 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
100b0 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
100c0 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
100d0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
100e0 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
100f0 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
10100 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10110 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
10120 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
10130 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
10140 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
10150 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
10160 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
10170 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10180 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
10190 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
101a0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
101b0 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
101c0 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
101d0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
101e0 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
101f0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10200 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
10210 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
10220 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
10230 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10240 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
10250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
10260 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10270 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
10280 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
10290 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
102a0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
102b0 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
102c0 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
102d0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
102e0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
102f0 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
10300 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
10310 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
10320 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
10330 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
10340 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
10350 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
10360 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10370 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
10380 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
10390 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
103a0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
103b0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
103c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
103d0 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
103e0 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
103f0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
10400 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
10410 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
10420 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
10430 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
10440 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
10450 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
10460 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20  served == 0) {. 
10470 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10480 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
10490 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
104a0 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
104b0 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
104c0 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
104d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
104e0 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
104f0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10500 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
10510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  ;.}../*.** An im
10520 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10530 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41  the UnlockFile A
10540 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
10550 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
10560 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  OOL winceUnlockF
10570 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
10580 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
10590 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
105a0 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
105b0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
105c0 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
105d0 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20  sToUnlockLow,.  
105e0 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
105f0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
10600 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
10610 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
10620 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
10630 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
10640 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
10650 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
10660 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10670 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10680 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10690 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b  esToUnlockHigh);
106a0 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
106b0 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
106c0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
106d0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
106e0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52  hMutex);..  /* R
106f0 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65  eleasing a reade
10700 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63  r lock or an exc
10710 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
10720 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
10730 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
10740 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20  HARED_FIRST){.  
10750 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65    /* Did we have
10760 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10770 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ck? */.    if (p
10780 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
10790 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61  lusive){.      a
107a0 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
107b0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
107c0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
107d0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46  _SIZE);.      pF
107e0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
107f0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10800 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10810 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
10820 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
10830 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10840 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20    }..    /* Did 
10850 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72  we just have a r
10860 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  eader lock? */. 
10870 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c     else if (pFil
10880 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10890 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  s){.      assert
108a0 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
108b0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
108c0 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
108d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
108e0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
108f0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
10900 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10910 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
10920 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
10930 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10940 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
10950 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
10960 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
10970 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10980 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
109a0 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
109b0 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
109c0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
109d0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
109e0 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
109f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
10a00 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10a10 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
10a20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10a30 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
10a40 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
10a50 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
10a60 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
10a70 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
10a80 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
10a90 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10aa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
10ab0 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
10ac0 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
10ad0 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
10ae0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10af0 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
10b00 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
10b10 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10b20 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
10b30 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10b40 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
10b50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10b60 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
10b70 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
10b80 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10b90 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
10ba0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10bb0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
10bc0 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
10bd0 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
10be0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
10bf0 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  turn;.}./*.** En
10c00 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
10c10 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
10c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
10c70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10c80 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
10c90 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72  ** Lock a file r
10ca0 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  egion..*/.static
10cb0 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c   BOOL winLockFil
10cc0 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10cd0 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c  File,.  DWORD fl
10ce0 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ags,.  DWORD off
10cf0 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
10d00 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
10d10 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
10d20 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
10d30 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
10d40 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
10d50 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
10d60 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
10d70 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
10d80 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
10d90 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
10da0 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
10db0 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
10dc0 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69  turn winceLockFi
10dd0 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
10de0 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
10df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10e00 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
10e10 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
10e20 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
10e30 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
10e40 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
10e50 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
10e60 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
10e70 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
10e80 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
10e90 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
10ea0 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
10eb0 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
10ec0 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
10ed0 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67  Ex(*phFile, flag
10ee0 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  s, 0, numBytesLo
10ef0 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c  w, numBytesHigh,
10f00 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
10f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  {.    return osL
10f20 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
10f30 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
10f40 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
10f50 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
10f60 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
10f70 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65  tesHigh);.  }.#e
10f80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  ndif.}../*.** Un
10f90 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  lock a file regi
10fa0 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42  on.. */.static B
10fb0 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  OOL winUnlockFil
10fc0 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10fd0 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66  File,.  DWORD of
10fe0 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
10ff0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11000 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11010 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11020 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
11030 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11040 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
11050 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
11060 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
11070 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
11080 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
11090 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e   **       API Un
110a0 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  lockFile..  */. 
110b0 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c   return winceUnl
110c0 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
110d0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
110e0 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
11110 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
11120 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  e.  if( osIsNT()
11130 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
11140 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
11150 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
11160 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
11170 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
11180 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
11190 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
111a0 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
111b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55  ;.    return osU
111c0 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  nlockFileEx(*phF
111d0 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ile, 0, numBytes
111e0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
111f0 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
11200 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
11210 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46  sUnlockFile(*phF
11220 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
11230 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
11240 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
11270 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
11280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
112d0 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
112e0 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  f routines imple
112f0 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74  ment the I/O met
11300 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a  hods specified.*
11310 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  * by the sqlite3
11320 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
11330 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct..************
11340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  **/../*.** Some 
11390 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  Microsoft compil
113a0 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
113b0 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
113c0 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54  ndef INVALID_SET
113d0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20  _FILE_POINTER.# 
113e0 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53  define INVALID_S
113f0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
11400 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
11410 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
11420 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
11430 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ion of the file 
11440 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
11450 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
11460 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
11470 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
11480 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
11490 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
114a0 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73   0. .** Otherwis
114b0 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
114c0 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
114d0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
114e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
114f0 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  ekFile(winFile *
11500 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
11510 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23  nt64 iOffset){.#
11520 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
11530 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  NRT.  LONG upper
11540 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
11550 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
11560 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
11570 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
11580 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
115a0 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
115b0 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
115c0 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
115d0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
115e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
115f0 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
11600 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
11610 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
11620 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
11630 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
11640 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
11650 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52  ror() */..  OSTR
11660 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
11670 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c  %p, offset=%lld\
11680 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f  n", pFile->h, iO
11690 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65  ffset));..  uppe
116a0 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
116b0 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
116c0 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
116d0 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
116e0 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
116f0 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
11700 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
11710 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
11720 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
11730 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
11740 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
11750 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
11760 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
11770 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
11780 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
11790 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
117a0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
117b0 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
117c0 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
117d0 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
117e0 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
117f0 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
11800 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
11810 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11820 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
11830 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
11840 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
11850 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
11860 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
11870 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
11880 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
11890 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
118a0 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
118b0 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
118c0 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
118d0 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
118e0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
118f0 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
11900 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11910 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
11920 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
11930 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11940 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
11950 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11960 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
11970 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
119a0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
119b0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
119c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
119d0 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
119e0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
119f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11a00 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
11a10 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
11a20 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
11a30 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
11a40 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a  n 0;.#else.  /*.
11a50 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f    ** Same as abo
11a60 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
11a70 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
11a80 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69  ion works for Wi
11a90 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52  nRT..  */..  LAR
11aa0 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20  GE_INTEGER x;   
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a  The new offset *
11ad0 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20  /.  BOOL bRet;  
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
11b00 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
11b10 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a  PointerEx() */..
11b20 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69    x.QuadPart = i
11b30 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d  Offset;.  bRet =
11b40 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
11b50 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c  rEx(pFile->h, x,
11b60 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b   0, FILE_BEGIN);
11b70 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20  ..  if(!bRet){. 
11b80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11b90 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11ba0 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
11bb0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11bc0 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
11bd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
11bf0 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nSeekFile", pFil
11c00 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f  e->zPath);.    O
11c10 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
11c20 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
11c30 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20  _IOERR_SEEK\n", 
11c40 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
11c50 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
11c60 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
11c70 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11c80 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
11c90 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  >h));.  return 0
11ca0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
11cb0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
11cc0 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72  SIZE>0./* Forwar
11cd0 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
11ce0 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
11cf0 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f  ds used for memo
11d00 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20  ry mapped files 
11d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
11d20 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
11d30 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
11d40 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
11d50 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69  nUnmapfile(winFi
11d60 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  le*);.#endif../*
11d70 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11d80 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
11d90 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
11da0 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
11db0 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
11dc0 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
11dd0 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
11de0 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
11df0 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f  esult, but Windo
11e00 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
11e10 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
11e20 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
11e30 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
11e40 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
11e50 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
11e60 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
11e70 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
11e80 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
11e90 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
11ea0 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
11eb0 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
11ec0 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
11ed0 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
11ee0 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
11ef0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
11f00 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
11f10 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
11f20 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
11f30 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74  t winClose(sqlit
11f40 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11f50 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b  int rc, cnt = 0;
11f60 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11f70 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
11f80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
11f90 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
11fa0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
11fb0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
11fc0 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Shm==0 );.#endif
11fd0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11fe0 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ->h!=NULL && pFi
11ff0 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  le->h!=INVALID_H
12000 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20  ANDLE_VALUE );. 
12010 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12020 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69   file=%p\n", pFi
12030 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51  le->h));..#if SQ
12040 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
12050 54 48 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20  THREADS>0.  if( 
12060 70 46 69 6c 65 2d 3e 70 72 65 43 61 63 68 65 54  pFile->preCacheT
12070 68 72 65 61 64 20 29 7b 0a 20 20 20 20 76 6f 69  hread ){.    voi
12080 64 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20 20  d *pOut = 0;.   
12090 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f   sqlite3ThreadJo
120a0 69 6e 28 70 46 69 6c 65 2d 3e 70 72 65 43 61 63  in(pFile->preCac
120b0 68 65 54 68 72 65 61 64 2c 20 26 70 4f 75 74 29  heThread, &pOut)
120c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
120d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
120e0 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e  P_SIZE>0.  winUn
120f0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
12100 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20  #endif..  do{.  
12110 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61    rc = osCloseHa
12120 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  ndle(pFile->h);.
12130 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49      /* SimulateI
12140 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e  OError( rc=0; cn
12150 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  t=MX_CLOSE_ATTEM
12160 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69  PT; ); */.  }whi
12170 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63  le( rc==0 && ++c
12180 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  nt < MX_CLOSE_AT
12190 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65  TEMPT && (sqlite
121a0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
121b0 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51  0), 1) );.#if SQ
121c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64  LITE_OS_WINCE.#d
121d0 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45  efine WINCE_DELE
121e0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a  TION_ATTEMPTS 3.
121f0 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f    winceDestroyLo
12200 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ck(pFile);.  if(
12210 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
12220 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e  nClose ){.    in
12230 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77  t cnt = 0;.    w
12240 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  hile(.          
12250 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70   osDeleteFileW(p
12260 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
12270 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20  lose)==0.       
12280 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74   && osGetFileAtt
12290 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e  ributesW(pFile->
122a0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21  zDeleteOnClose)!
122b0 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20  =0xffffffff .   
122c0 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20       && cnt++ < 
122d0 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
122e0 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20  TTEMPTS.    ){. 
122f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
12300 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20  n32_sleep(100); 
12310 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c   /* Wait a littl
12320 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  e before trying 
12330 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  again */.    }. 
12340 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12350 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
12360 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  Close);.  }.#end
12370 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  if.  if( rc ){. 
12380 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55     pFile->h = NU
12390 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f  LL;.  }.  OpenCo
123a0 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54  unter(-1);.  OST
123b0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c  RACE(("CLOSE fil
123c0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
123d0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
123e0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
123f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
12400 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
12410 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
12420 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12430 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73  _CLOSE, osGetLas
12440 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20      "winClose", 
12470 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d  pFile->zPath);.}
12480 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
12490 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
124a0 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
124b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
124c0 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
124d0 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
124e0 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
124f0 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
12500 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
12510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12520 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74  winRead(.  sqlit
12530 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
12540 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
12550 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
12560 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
12570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12580 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ite content into
12590 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
125a0 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125c0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
125d0 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c  to read */.  sql
125e0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
125f0 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  t       /* Begin
12600 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73   reading at this
12610 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69   offset */.){.#i
12620 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12630 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  CE.  OVERLAPPED 
12640 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20  overlapped;     
12650 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
12660 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e  et for ReadFile.
12670 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   */.#endif.  win
12680 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
12690 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
126a0 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
126b0 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20   DWORD nRead;   
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
126e0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
126f0 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
12700 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
12730 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  trys */..  asser
12740 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
12750 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
12760 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
12770 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
12780 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
12790 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
127a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
127b0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66  EAD file=%p, buf
127c0 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25  fer=%p, amount=%
127d0 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  d, offset=%lld, 
127e0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
127f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
12800 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
12810 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
12820 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
12830 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12840 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
12850 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
12860 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
12870 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
12880 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
12890 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
128a0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
128b0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
128c0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
128d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
128e0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
128f0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
12900 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
12910 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
12920 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
12930 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12940 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
12950 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41  TRACE(("READ-MMA
12960 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  P file=%p, rc=SQ
12970 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
12980 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
12990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
129a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
129b0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
129c0 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
129d0 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
129e0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
129f0 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
12a00 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
12a10 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
12a20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
12a30 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
12a40 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
12a50 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
12a60 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
12a70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
12a80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12a90 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b  CE.  if( winSeek
12aa0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
12ab0 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  et) ){.    OSTRA
12ac0 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
12ad0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
12ae0 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  L\n", pFile->h))
12af0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12b00 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
12b10 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
12b20 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
12b30 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
12b40 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65  0) ){.#else.  me
12b50 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
12b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
12b70 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72  LAPPED));.  over
12b80 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
12b90 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
12ba0 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f  0xffffffff);.  o
12bb0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
12bc0 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
12bd0 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
12be0 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c  fffffff);.  whil
12bf0 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
12c00 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
12c10 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65  mt, &nRead, &ove
12c20 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20  rlapped) &&.    
12c30 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
12c40 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e  ror()!=ERROR_HAN
12c50 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69  DLE_EOF ){.#endi
12c60 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  f.    DWORD last
12c70 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77  Errno;.    if( w
12c80 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
12c90 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
12ca0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12cb0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12cc0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
12cd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
12ce0 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
12cf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
12d00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12d10 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
12d20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12d30 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65  OERR_READ, pFile
12d40 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70      "winRead", p
12d70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
12d80 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  }.  winLogIoerr(
12d90 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e  nRetry);.  if( n
12da0 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20  Read<(DWORD)amt 
12db0 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  ){.    /* Unread
12dc0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
12dd0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
12de0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
12df0 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
12e00 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c  pBuf)[nRead], 0,
12e10 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20   amt-nRead);.   
12e20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
12e30 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12e40 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
12e50 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EAD\n", pFile->h
12e60 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
12e70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
12e80 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f  T_READ;.  }..  O
12e90 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
12ea0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12eb0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12ec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
12ed0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12ee0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
12ef0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
12f00 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
12f10 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12f20 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
12f30 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
12f40 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
12f50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
12f60 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
12f70 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
12f80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
12f90 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
12fa0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
12fb0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
12fc0 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
12fd0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
12fe0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
13010 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
13020 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
13030 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
13040 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
13050 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
13060 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
13070 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
13080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13090 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
130a0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
130b0 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
130c0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
130d0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
130e0 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
130f0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
13100 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
13110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13120 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
13130 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
13140 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13150 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
13160 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
13170 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
13180 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
13190 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
131a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
131b0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
131c0 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62  WRITE file=%p, b
131d0 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
131e0 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%d, offset=%lld
131f0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
13200 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
13210 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
13220 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
13230 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
13240 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
13250 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
13260 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
13270 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
13280 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
13290 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
132a0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
132b0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
132c0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
132d0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
132e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
132f0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
13300 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
13310 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
13320 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
13330 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
13340 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
13350 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
13360 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
13370 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
13380 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13390 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
133a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
133b0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
133c0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
133d0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
133e0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
133f0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
13400 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
13410 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
13420 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79  et], pBuf, nCopy
13430 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
13440 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
13450 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
13460 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
13470 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
13480 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13490 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
134a0 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69  _WINCE.  rc = wi
134b0 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
134c0 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
134d0 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20  rc==0 ){.#else. 
134e0 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53   {.#endif.#if !S
134f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13500 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
13510 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
13520 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
13530 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f  or WriteFile. */
13540 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
13550 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75  aRem = (u8 *)pBu
13560 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  f;        /* Dat
13570 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  a yet to be writ
13580 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
13590 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20  Rem = amt;      
135a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
135b0 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20  er of bytes yet 
135c0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
135d0 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74  .    DWORD nWrit
135e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
135f0 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74     /* Bytes writ
13600 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74  ten by each Writ
13610 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a  eFile() call */.
13620 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
13630 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20  rno = NO_ERROR; 
13640 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13650 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
13660 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53  ror() */..#if !S
13670 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13680 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c     memset(&overl
13690 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
136a0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
136b0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
136c0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
136d0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
136e0 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  f);.    overlapp
136f0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
13700 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
13710 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
13720 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77  );.#endif..    w
13730 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
13740 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13750 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f  NCE.      if( !o
13760 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
13770 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
13780 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a   &nWrite, 0) ){.
13790 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
137a0 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
137b0 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
137c0 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65  m, &nWrite, &ove
137d0 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64  rlapped) ){.#end
137e0 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  if.        if( w
137f0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
13800 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
13810 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
13820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13830 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
13840 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
13850 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
13860 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
13870 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
13880 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
13890 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
138a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
138b0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
138c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
138d0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
138e0 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73  WINCE.      offs
138f0 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  et += nWrite;.  
13900 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
13910 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
13920 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
13930 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ff);.      overl
13940 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
13950 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
13960 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
13970 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  fff);.#endif.   
13980 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
13990 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
139a0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
139b0 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
139c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
139d0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
139e0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
139f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
13a00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
13a10 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
13a20 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
13a30 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
13a40 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
13a50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
13a60 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
13a70 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
13a80 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
13a90 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
13aa0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
13ac0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13ad0 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61  _FULL, pFile->la
13ae0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70    "winWrite1", p
13b10 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13b20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28    }.    OSTRACE(
13b30 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
13b40 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
13b50 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65  _WRITE\n", pFile
13b60 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
13b70 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
13b80 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
13b90 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13ba0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13bb0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
13bc0 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite2", pFile->z
13bd0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
13be0 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
13bf0 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f  nRetry);.  }.  O
13c00 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
13c10 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13c20 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13c30 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
13c40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13c50 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
13c60 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
13c70 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
13c80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
13c90 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
13ca0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
13cb0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
13cc0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
13cd0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
13ce0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
13cf0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
13d00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13d20 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
13d30 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
13d40 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
13d60 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
13d70 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
13d80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
13d90 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  CATE);.  OSTRACE
13da0 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
13db0 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20  =%p, size=%lld, 
13dc0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
13dd0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
13de0 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c   nByte, pFile->l
13df0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
13e00 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
13e10 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
13e20 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
13e30 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
13e40 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
13e50 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
13e60 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
13e70 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
13e80 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
13e90 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
13ea0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
13eb0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
13ec0 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
13ed0 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
13ee0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
13ef0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
13f00 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
13f10 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
13f20 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
13f30 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
13f40 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
13f50 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  }..  /* SetEndOf
13f60 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e  File() returns n
13f70 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63  on-zero when suc
13f80 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f  cessful, or zero
13f90 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20   when it fails. 
13fa0 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b  */.  if( winSeek
13fb0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  File(pFile, nByt
13fc0 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  e) ){.    rc = w
13fd0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
13fe0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
13ff0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
14000 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14010 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
14020 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  ncate1", pFile->
14030 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20  zPath);.  }else 
14040 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f  if( 0==osSetEndO
14050 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
14060 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  &&.            (
14070 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
14080 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
14090 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45  ERROR_USER_MAPPE
140a0 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70  D_FILE) ){.    p
140b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
140c0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
140d0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
140e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
140f0 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
14100 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20  "winTruncate2", 
14130 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14140 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
14150 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
14160 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
14170 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
14180 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20   a size smaller 
14190 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
141a0 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  ly.  ** mapped r
141b0 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
141c0 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
141d0 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
141e0 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
141f0 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e  ** use read() an
14200 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63  d write() to acc
14210 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20  ess data beyond 
14220 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
14230 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  now on..  */.  i
14240 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  f( pFile->pMapRe
14250 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46  gion && nByte<pF
14260 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
14270 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
14280 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
14290 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
142a0 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66  ACE(("TRUNCATE f
142b0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
142c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
142d0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
142e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
142f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14300 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
14310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
14320 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
14330 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
14340 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
14350 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
14360 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
14370 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
14380 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
14390 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
143a0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
143b0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
143c0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
143d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
143e0 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
143f0 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
14400 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
14410 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
14420 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
14430 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
14440 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
14450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
14460 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
14470 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
14480 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
14490 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
144a0 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
144b0 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
144c0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
144d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
144e0 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
144f0 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
14500 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
14510 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
14520 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
14530 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
14540 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
14550 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
14560 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
14570 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
14580 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
14590 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
145a0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
145b0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
145c0 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
145d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
145e0 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
145f0 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
14600 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
14610 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
14620 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
14630 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
14640 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
14650 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
14660 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
14670 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
14680 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
14690 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
146a0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
146b0 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
146c0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
146d0 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
146e0 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
146f0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
14700 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
14710 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
14720 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
14730 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53  TE_FULL );..  OS
14740 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
14750 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
14760 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
14770 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
14780 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c   flags, pFile->l
14790 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e  ocktype));..#ifn
147a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
147b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
147c0 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
147d0 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
147e0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
147f0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
14800 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
14810 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
14820 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
14830 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
14840 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
14850 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
14860 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
14870 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
14880 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
14890 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
148a0 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28  SYNC.  OSTRACE((
148b0 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25  "SYNC-NOP file=%
148c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
148d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
148e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148f0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  OK;.#else.  rc =
14900 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
14910 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
14920 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14930 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
14940 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
14950 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
14960 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14970 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
14980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
14990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
149a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
149b0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
149c0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
149d0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
149e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
149f0 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c  _IOERR_FSYNC\n",
14a00 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14a10 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14a20 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14a30 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
14a40 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
14a70 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
14a80 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
14a90 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
14aa0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
14ab0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
14ac0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
14ad0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
14ae0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
14af0 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
14b00 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14b10 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14b20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14b30 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
14b40 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
14b50 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b  ert( pSize!=0 );
14b60 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14b70 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14b80 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
14b90 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
14ba0 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
14bb0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
14bc0 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51  pSize));..#if SQ
14bd0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
14be0 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44  {.    FILE_STAND
14bf0 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20  ARD_INFO info;. 
14c00 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65     if( osGetFile
14c10 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
14c20 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  dleEx(pFile->h, 
14c30 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f  FileStandardInfo
14c40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69         &info, si
14c70 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20  zeof(info)) ){. 
14c80 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e       *pSize = in
14c90 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61  fo.EndOfFile.Qua
14ca0 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  dPart;.    }else
14cb0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
14cc0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14cd0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14ce0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
14cf0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14d00 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
14d10 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
14d40 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14d50 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
14d60 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70   {.    DWORD upp
14d70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
14d80 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  D lowerBits;.   
14d90 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
14da0 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73  ;..    lowerBits
14db0 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65   = osGetFileSize
14dc0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
14dd0 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69  rBits);.    *pSi
14de0 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
14df0 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
14e00 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
14e10 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f  s;.    if(   (lo
14e20 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c  werBits == INVAL
14e30 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20  ID_FILE_SIZE).  
14e40 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
14e50 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
14e60 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
14e70 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  R) ){.      pFil
14e80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
14e90 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
14ea0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
14eb0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
14ec0 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
14ed0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14ef0 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
14f00 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14f10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  }.  }.#endif.  O
14f20 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
14f30 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c  le=%p, pSize=%p,
14f40 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63   *pSize=%lld, rc
14f50 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
14f60 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69     pFile->h, pSi
14f70 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69  ze, *pSize, sqli
14f80 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
14f90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14fa0 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
14fb0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
14fc0 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
14fd0 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
14fe0 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
14ff0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
15000 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
15010 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
15020 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
15030 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
15040 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
15050 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
15060 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
15070 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
15080 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
15090 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
150a0 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
150b0 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
150c0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
150d0 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
150e0 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
150f0 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
15100 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
15110 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
15120 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
15130 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
15140 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
15150 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
15160 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
15170 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
15180 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
15190 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
151a0 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
151b0 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
151c0 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
151d0 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
151e0 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
151f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
15200 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
15210 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
15220 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
15230 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
15240 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
15250 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
15260 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
15290 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
152a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
152b0 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
152c0 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
152d0 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
152e0 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
152f0 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
15300 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
15310 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
15320 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
15330 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
15340 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
15350 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
15360 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
15370 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
15380 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15390 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
153a0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
153b0 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
153c0 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
153d0 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
153e0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
153f0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
15400 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
15410 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
15420 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  int winGetReadLo
15430 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
15440 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
15450 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
15460 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
15470 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
15480 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
15490 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
154a0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
154b0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
154c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
154d0 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
154e0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
154f0 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
15500 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
15510 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  2.    **       A
15520 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20  PI LockFileEx.. 
15530 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20     */.    res = 
15540 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70  winceLockFile(&p
15550 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
15560 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
15570 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d  .#else.    res =
15580 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
15590 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
155a0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
155b0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
155c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
155d0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
155e0 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  IZE, 0);.#endif.
155f0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
15600 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
15610 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
15620 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
15630 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
15640 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
15650 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
15660 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
15670 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
15680 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
15690 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
156a0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
156b0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
156c0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
156f0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
15700 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
15710 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
15720 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
15730 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
15740 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15750 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
15760 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
15770 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
15780 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41  k */.  }.  OSTRA
15790 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66  CE(("READ-LOCK f
157a0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
157b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
157c0 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
157d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
157e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61  .}../*.** Undo a
157f0 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61   readlock.*/.sta
15800 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
15810 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
15820 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
15830 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61   res;.  DWORD la
15840 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41  stErrno;.  OSTRA
15850 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b  CE(("READ-UNLOCK
15860 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
15870 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
15880 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15890 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  );.  if( osIsNT(
158a0 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  ) ){.    res = w
158b0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
158c0 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
158d0 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
158e0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69  SIZE, 0);.  }.#i
158f0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
15900 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
15910 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  e{.    res = win
15920 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15930 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
15940 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
15950 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
15960 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
15970 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
15980 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
15990 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
159a0 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44  ERROR_NOT_LOCKED
159b0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
159c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
159d0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
159e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
159f0 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c  ERR_UNLOCK, pFil
15a00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15a20 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
15a30 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
15a40 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15a50 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
15a60 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
15a70 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
15a80 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
15a90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
15aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
15ab0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
15ac0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
15ad0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
15ae0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
15af0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
15b00 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
15b10 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
15b20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
15b30 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
15b40 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
15b50 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
15b60 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
15b70 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
15b80 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
15b90 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
15ba0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
15bb0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
15bc0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
15bd0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
15be0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
15bf0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
15c00 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
15c10 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
15c20 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
15c30 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
15c40 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
15c50 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
15c60 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
15c70 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
15c80 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
15c90 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
15ca0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
15cb0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
15cc0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
15cd0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
15ce0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
15cf0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
15d00 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15d10 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
15d20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
15d30 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
15d40 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
15d50 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
15d60 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
15d70 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
15d80 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
15d90 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
15da0 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
15db0 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
15dc0 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
15dd0 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
15de0 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
15df0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
15e00 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
15e10 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
15e20 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
15e30 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
15e40 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
15e50 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
15e60 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
15e70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15e80 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
15e90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15ea0 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
15eb0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
15ec0 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
15ed0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
15ee0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
15ef0 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
15f00 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
15f10 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
15f20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
15f30 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
15f40 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
15f50 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
15f60 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
15f70 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
15f80 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
15f90 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
15fa0 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
15fb0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
15fc0 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
15fd0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
15fe0 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
15ff0 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
16000 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
16010 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
16020 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
16030 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16040 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
16050 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
16060 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
16070 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
16080 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
16090 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
160a0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
160b0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
160c0 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
160d0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
160e0 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
160f0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
16100 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
16110 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16120 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16130 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16140 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
16150 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
16160 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
16170 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
16180 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
16190 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
161a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
161b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
161c0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
161d0 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
161e0 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
161f0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
16200 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
16210 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
16220 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16230 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
16240 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
16250 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
16260 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
16270 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
16280 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
16290 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
162a0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
162b0 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
162c0 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
162d0 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
162e0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
162f0 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
16300 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
16310 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
16320 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
16330 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
16340 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
16350 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
16360 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
16370 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
16380 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
16390 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
163a0 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
163b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
163c0 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
163d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
163e0 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
163f0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
16400 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
16410 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
16420 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
16430 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
16440 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
16480 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
16490 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
164a0 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
164b0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
164c0 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  k.  This is need
164d0 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20  ed to work.     
164e0 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c   ** around probl
164f0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e  ems caused by in
16500 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e  dexing and/or an
16510 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72  ti-virus softwar
16520 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69  e on.      ** Wi
16530 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20  ndows systems.. 
16540 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61       ** If you a
16550 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f  re using this co
16560 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f  de as a model fo
16570 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46  r alternative VF
16580 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20  Ses, do not.    
16590 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72    ** copy this r
165a0 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20  etry logic.  It 
165b0 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64  is a hack intend
165c0 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f  ed for Windows o
165d0 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nly..      */.  
165e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
165f0 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
16600 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
16610 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
16620 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
16630 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
16640 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
16650 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
16660 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
16670 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
16680 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
16690 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
166a0 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
166b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
166c0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
166d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
166e0 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
166f0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
16700 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16710 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
16720 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
16730 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
16740 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
16750 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
16760 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
16770 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
16780 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
16790 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
167a0 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
167b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
167c0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
167d0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
167e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
167f0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16800 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
16810 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
16820 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
16830 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16840 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
16850 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
16860 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
16870 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
16880 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
16890 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
168a0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
168b0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
168c0 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
168d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
168e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
168f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
16900 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
16910 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
16920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
16930 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16940 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
16950 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
16960 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
16970 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
16980 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
16990 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
169a0 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
169b0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
169c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
169d0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
169e0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
169f0 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
16a00 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
16a10 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
16a20 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
16a30 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16a40 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
16a50 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
16a60 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
16a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a80 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
16a90 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
16aa0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
16ab0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
16ac0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
16ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
16ae0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16af0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
16b00 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
16b10 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
16b20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
16b30 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
16b40 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
16b50 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
16b60 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
16b70 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
16b80 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
16b90 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
16ba0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16bb0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
16bc0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16bd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
16be0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
16bf0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
16c00 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
16c10 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
16c20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16c30 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
16c40 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16c50 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
16c60 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
16c70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16c80 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
16c90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16ca0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
16cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16cc0 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  USY;.    OSTRACE
16cd0 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
16ce0 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
16cf0 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
16d00 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16d10 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
16d20 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a  Locktype));.  }.
16d30 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
16d40 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
16d50 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
16d60 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  "LOCK file=%p, l
16d70 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
16d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
16d90 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
16da0 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
16db0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
16dc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16dd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16de0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
16df0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
16e00 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
16e10 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
16e20 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
16e30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
16e40 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
16e50 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
16e60 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
16e70 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
16e80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
16e90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
16ea0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16eb0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
16ec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
16ed0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
16ee0 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
16ef0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
16f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16f10 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
16f20 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41  LOCK; );.  OSTRA
16f30 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16f40 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
16f50 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ut=%p\n", pFile-
16f60 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  >h, pResOut));..
16f70 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
16f80 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
16f90 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
16fa0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16fb0 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
16fc0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16fd0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64  K file=%p, rc=%d
16fe0 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
16ff0 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
17000 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77  else{.    rc = w
17010 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
17020 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
17030 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
17040 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17050 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
17060 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e  c ){.      winUn
17070 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17080 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
17090 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
170a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b   }.    rc = !rc;
170b0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
170c0 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
170d0 3d 25 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f  =%p, rc=%d (remo
170e0 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
170f0 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  , rc));.  }.  *p
17100 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
17110 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17120 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
17130 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
17140 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
17150 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
17160 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52      pFile->h, pR
17170 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
17180 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
171a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
171b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
171c0 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
171d0 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
171e0 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
171f0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17200 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
17210 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
17220 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
17230 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17240 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
17250 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
17260 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
17270 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
17280 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17290 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
172a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
172b0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
172c0 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
172d0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
172e0 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
172f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17300 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
17310 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
17320 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
17330 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
17340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17350 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
17360 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
17370 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
17380 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
17390 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
173a0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
173b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
173c0 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
173d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
173e0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
173f0 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
17400 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
17410 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
17420 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
17430 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17440 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17450 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
17460 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
17470 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20  ktype));.  type 
17480 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
17490 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
174a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
174b0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
174c0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
174d0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
174e0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
174f0 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
17500 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
17510 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b   !winGetReadLock
17520 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
17530 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
17540 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
17550 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
17560 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
17570 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
17580 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
17590 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
175a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
175b0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
175c0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
175f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17610 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
17620 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
17630 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17640 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
17650 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
17660 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
17670 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
17680 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
17690 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  .    winUnlockRe
176a0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
176b0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
176c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
176d0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
176e0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
176f0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
17700 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
17710 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
17720 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
17730 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
17740 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
17750 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17760 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
17770 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
17780 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17790 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
177a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
177b0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
177c0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
177d0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
177e0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
177f0 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
17800 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
17810 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
17820 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
17830 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
17840 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
17850 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
17860 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
17870 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
17880 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
17890 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42  ic void winModeB
178a0 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  it(winFile *pFil
178b0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
178c0 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
178d0 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
178e0 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
178f0 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
17900 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
17910 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
17920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
17930 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
17940 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
17950 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
17960 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
17970 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
17980 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
17990 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73  S helper methods
179a0 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72   used for tempor
179b0 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61  ary files */.sta
179c0 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65  tic int winGetTe
179d0 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  mpname(sqlite3_v
179e0 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a  fs *, char **);.
179f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73  static int winIs
17a00 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  Dir(const void *
17a10 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  );.static BOOL w
17a20 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
17a30 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68  ndColon(const ch
17a40 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ar *);../*.** Co
17a50 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
17a60 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
17a70 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
17a80 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
17a90 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
17aa0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
17ab0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
17ac0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17ad0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
17ae0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
17af0 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20  file=%p, op=%d, 
17b00 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  pArg=%p\n", pFil
17b10 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29  e->h, op, pArg))
17b20 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
17b30 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
17b40 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
17b50 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
17b60 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
17b70 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
17b80 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
17b90 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
17ba0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
17bb0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
17bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17bd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
17be0 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
17bf0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
17c00 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
17c10 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
17c20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17c30 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17c40 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17c50 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
17c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17c70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17c80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
17c90 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
17ca0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
17cb0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
17cc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17cd0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17ce0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17cf0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
17d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17d10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
17d20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
17d30 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
17d40 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
17d50 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20  Chunk>0 ){.     
17d60 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
17d70 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20   oldSz;.        
17d80 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65  int rc = winFile
17d90 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
17da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17db0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17dc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17dd0 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a  _int64 newSz = *
17de0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
17df0 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  pArg;.          
17e00 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20  if( newSz>oldSz 
17e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
17e20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
17e30 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
17e40 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
17e50 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29  ncate(id, newSz)
17e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ;.            Si
17e70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17e80 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ign(0);.        
17e90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17ea0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17eb0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17ec0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
17ed0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
17ee0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
17ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17f00 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
17f10 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
17f20 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
17f30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
17f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17f50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
17f60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
17f70 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
17f80 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
17f90 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
17fa0 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
17fb0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
17fc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17fd0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17fe0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17ff0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
18000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18010 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18020 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
18030 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
18040 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
18050 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
18060 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
18070 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
18080 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18090 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
180a0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
180b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
180c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
180d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
180e0 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
180f0 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
18100 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
18110 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
18120 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
18130 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
18140 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18150 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18160 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
18170 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18180 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18190 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
181a0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
181b0 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
181c0 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
181d0 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
181e0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
181f0 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
18200 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18210 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
18220 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  nIoerrRetry;.   
18230 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
18240 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
18250 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
18260 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
18270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18280 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[1] = winIoerr
18290 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
182a0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
182b0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
182c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
182d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
182e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
182f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18300 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18310 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
18320 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
18330 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  zTFile = 0;.    
18340 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65    int rc = winGe
18350 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
18360 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b  >pVfs, &zTFile);
18370 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
18380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18390 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
183a0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
183b0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
183c0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
183d0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
183e0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
183f0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
18400 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18410 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
18420 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
18430 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18440 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
18450 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
18460 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
18470 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
18480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18490 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
184a0 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
184b0 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
184c0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
184d0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
184e0 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
184f0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
18500 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
18510 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
18520 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
18530 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
18540 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
18550 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
18560 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
18570 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
18580 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
18590 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
185a0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
185b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
185c0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
185d0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
185e0 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70  c = winMapfile(p
185f0 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
18600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18610 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
18620 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
18630 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
18640 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
18650 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
18660 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
18670 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  dif.  }.  OSTRAC
18680 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18690 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54  p, rc=SQLITE_NOT
186a0 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  FOUND\n", pFile-
186b0 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
186c0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
186d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
186e0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
186f0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
18700 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
18710 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
18720 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
18730 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
18740 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
18750 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
18760 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
18770 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
18780 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
18790 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
187a0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
187b0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
187c0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
187d0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
187e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
187f0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
18800 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
18810 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
18820 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
18830 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
18840 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
18850 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
18860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18870 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
18880 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
18890 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74   (void)id;.  ret
188a0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
188b0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
188c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
188d0 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
188e0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
188f0 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
18900 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
18910 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
18920 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
18930 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69  winFile *p = (wi
18940 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74  nFile*)id;.  ret
18950 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
18960 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
18970 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20  N_OPEN |.       
18980 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73    ((p->ctrlFlags
18990 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29   & WINFILE_PSOW)
189a0 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f  ?SQLITE_IOCAP_PO
189b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
189c0 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E:0);.}../*.** T
189d0 68 72 65 61 64 20 72 6f 75 74 69 6e 65 20 74 68  hread routine th
189e0 61 74 20 73 65 65 6b 73 20 74 6f 20 74 68 65 20  at seeks to the 
189f0 65 6e 64 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  end of an open f
18a00 69 6c 65 20 61 6e 64 20 72 65 61 64 73 20 6f 6e  ile and reads on
18a10 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68 69 73 20  e byte..** This 
18a20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
18a30 64 65 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  de a hint to the
18a40 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
18a50 6d 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  m that the entir
18a60 65 0a 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64  e.** file should
18a70 20 62 65 20 68 65 6c 64 20 69 6e 20 74 68 65 20   be held in the 
18a80 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
18a90 20 76 6f 69 64 20 2a 77 69 6e 50 72 65 43 61 63   void *winPreCac
18aa0 68 65 54 68 72 65 61 64 28 76 6f 69 64 20 2a 70  heThread(void *p
18ab0 43 74 78 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  Ctx){.  winFile 
18ac0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
18ad0 65 2a 29 70 43 74 78 3b 0a 20 20 76 6f 69 64 20  e*)pCtx;.  void 
18ae0 2a 70 42 75 66 20 3d 20 30 3b 0a 20 20 44 57 4f  *pBuf = 0;.  DWO
18af0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
18b00 48 41 4e 44 4c 45 20 64 75 70 48 61 6e 64 6c 65  HANDLE dupHandle
18b10 20 3d 20 4e 55 4c 4c 3b 0a 20 20 44 57 4f 52 44   = NULL;.  DWORD
18b20 20 64 77 53 69 7a 65 2c 20 64 77 52 65 74 3b 0a   dwSize, dwRet;.
18b30 20 20 44 57 4f 52 44 20 64 77 41 6d 74 3b 0a 20    DWORD dwAmt;. 
18b40 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 0a 0a 20   DWORD nRead;.. 
18b50 20 69 66 28 20 21 6f 73 44 75 70 6c 69 63 61 74   if( !osDuplicat
18b60 65 48 61 6e 64 6c 65 28 47 65 74 43 75 72 72 65  eHandle(GetCurre
18b70 6e 74 50 72 6f 63 65 73 73 28 29 2c 20 70 46 69  ntProcess(), pFi
18b80 6c 65 2d 3e 68 2c 20 47 65 74 43 75 72 72 65 6e  le->h, GetCurren
18b90 74 50 72 6f 63 65 73 73 28 29 2c 0a 20 20 20 20  tProcess(),.    
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 26 64 75 70 48 61 6e 64 6c 65 2c       &dupHandle,
18bc0 20 30 2c 20 46 41 4c 53 45 2c 20 44 55 50 4c 49   0, FALSE, DUPLI
18bd0 43 41 54 45 5f 53 41 4d 45 5f 41 43 43 45 53 53  CATE_SAME_ACCESS
18be0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
18bf0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18c00 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18c10 20 20 4f 53 54 52 41 43 45 28 28 22 50 52 45 2d    OSTRACE(("PRE-
18c20 43 41 43 48 45 20 66 69 6c 65 3d 25 70 2c 20 72  CACHE file=%p, r
18c30 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5c 6e  c=SQLITE_IOERR\n
18c40 22 2c 20 64 75 70 48 61 6e 64 6c 65 29 29 3b 0a  ", dupHandle));.
18c50 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
18c60 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
18c70 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
18c80 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
18ca0 69 6e 50 72 65 43 61 63 68 65 54 68 72 65 61 64  inPreCacheThread
18cb0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
18cc0 29 3b 0a 20 20 7d 0a 20 20 64 77 53 69 7a 65 20  );.  }.  dwSize 
18cd0 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
18ce0 65 72 28 64 75 70 48 61 6e 64 6c 65 2c 20 30 2c  er(dupHandle, 0,
18cf0 20 30 2c 20 46 49 4c 45 5f 45 4e 44 29 3b 0a 20   0, FILE_END);. 
18d00 20 69 66 28 20 28 64 77 53 69 7a 65 3d 3d 49 4e   if( (dwSize==IN
18d10 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
18d20 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20  OINTER.      && 
18d30 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
18d40 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
18d50 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20  =NO_ERROR)) ){. 
18d60 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
18d70 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
18d80 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
18d90 6c 65 28 64 75 70 48 61 6e 64 6c 65 29 3b 0a 20  le(dupHandle);. 
18da0 20 20 20 4f 53 54 52 41 43 45 28 28 22 50 52 45     OSTRACE(("PRE
18db0 2d 43 41 43 48 45 20 66 69 6c 65 3d 25 70 2c 20  -CACHE file=%p, 
18dc0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
18dd0 53 45 45 4b 5c 6e 22 2c 20 64 75 70 48 61 6e 64  SEEK\n", dupHand
18de0 6c 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  le));.    return
18df0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
18e00 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
18e10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
18e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18e30 20 20 20 20 20 20 20 20 20 22 77 69 6e 50 72 65           "winPre
18e40 43 61 63 68 65 54 68 72 65 61 64 32 22 2c 20 70  CacheThread2", p
18e50 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
18e60 7d 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  }.  dwRet = osSe
18e70 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 64 75 70  tFilePointer(dup
18e80 48 61 6e 64 6c 65 2c 20 30 2c 20 30 2c 20 46 49  Handle, 0, 0, FI
18e90 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28  LE_BEGIN);.  if(
18ea0 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44   (dwRet==INVALID
18eb0 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
18ec0 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  R.      && ((las
18ed0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
18ee0 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
18ef0 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46  RROR)) ){.    pF
18f00 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
18f10 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
18f20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 64 75  osCloseHandle(du
18f30 70 48 61 6e 64 6c 65 29 3b 0a 20 20 20 20 4f 53  pHandle);.    OS
18f40 54 52 41 43 45 28 28 22 50 52 45 2d 43 41 43 48  TRACE(("PRE-CACH
18f50 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  E file=%p, rc=SQ
18f60 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c  LITE_IOERR_SEEK\
18f70 6e 22 2c 20 64 75 70 48 61 6e 64 6c 65 29 29 3b  n", dupHandle));
18f80 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
18f90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
18fa0 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
18fb0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 22 77 69 6e 50 72 65 43 61 63 68 65      "winPreCache
18fe0 54 68 72 65 61 64 32 22 2c 20 70 46 69 6c 65 2d  Thread2", pFile-
18ff0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 64  >zPath);.  }.  d
19000 77 41 6d 74 20 3d 20 34 31 39 34 33 30 34 3b 20  wAmt = 4194304; 
19010 2f 2a 20 54 4f 44 4f 3a 20 54 75 6e 69 6e 67 2e  /* TODO: Tuning.
19020 20 2a 2f 0a 20 20 69 66 28 20 64 77 53 69 7a 65   */.  if( dwSize
19030 3c 64 77 41 6d 74 20 29 7b 0a 20 20 20 20 64 77  <dwAmt ){.    dw
19040 41 6d 74 20 3d 20 64 77 53 69 7a 65 3b 0a 20 20  Amt = dwSize;.  
19050 7d 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74  }.  pBuf = sqlit
19060 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 64 77  e3MallocZero( dw
19070 41 6d 74 20 29 3b 0a 20 20 69 66 28 20 70 42 75  Amt );.  if( pBu
19080 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 73 43 6c  f==0 ){.    osCl
19090 6f 73 65 48 61 6e 64 6c 65 28 64 75 70 48 61 6e  oseHandle(dupHan
190a0 64 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  dle);.    OSTRAC
190b0 45 28 28 22 50 52 45 2d 43 41 43 48 45 20 66 69  E(("PRE-CACHE fi
190c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
190d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
190e0 20 64 75 70 48 61 6e 64 6c 65 29 29 3b 0a 20 20   dupHandle));.  
190f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19100 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
19110 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
19120 20 20 20 69 66 28 20 21 6f 73 52 65 61 64 46 69     if( !osReadFi
19130 6c 65 28 64 75 70 48 61 6e 64 6c 65 2c 20 70 42  le(dupHandle, pB
19140 75 66 2c 20 64 77 41 6d 74 2c 20 26 6e 52 65 61  uf, dwAmt, &nRea
19150 64 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 70  d, 0) ){.      p
19160 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
19170 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
19180 28 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73  ();.      osClos
19190 65 48 61 6e 64 6c 65 28 64 75 70 48 61 6e 64 6c  eHandle(dupHandl
191a0 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
191b0 45 28 28 22 50 52 45 2d 43 41 43 48 45 20 66 69  E(("PRE-CACHE fi
191c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
191d0 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20  _IOERR_READ\n", 
191e0 64 75 70 48 61 6e 64 6c 65 29 29 3b 0a 20 20 20  dupHandle));.   
191f0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
19200 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
19210 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e  RR_READ, pFile->
19220 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 22 77 69 6e 50 72 65 43 61 63 68 65      "winPreCache
19250 54 68 72 65 61 64 33 22 2c 20 70 46 69 6c 65 2d  Thread3", pFile-
19260 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
19270 20 20 20 69 66 28 20 6e 52 65 61 64 3c 64 77 41     if( nRead<dwA
19280 6d 74 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  mt ){.      osCl
19290 6f 73 65 48 61 6e 64 6c 65 28 64 75 70 48 61 6e  oseHandle(dupHan
192a0 64 6c 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  dle);.      OSTR
192b0 41 43 45 28 28 22 50 52 45 2d 43 41 43 48 45 20  ACE(("PRE-CACHE 
192c0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
192d0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
192e0 45 41 44 5c 6e 22 2c 20 64 75 70 48 61 6e 64 6c  EAD\n", dupHandl
192f0 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e));.      retur
19300 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
19310 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
19320 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
19330 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 22 77 69 6e 50 72 65 43 61 63 68 65 54 68    "winPreCacheTh
19360 72 65 61 64 34 22 2c 20 70 46 69 6c 65 2d 3e 7a  read4", pFile->z
19370 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
19380 20 64 77 53 69 7a 65 20 2d 3d 20 64 77 41 6d 74   dwSize -= dwAmt
19390 3b 0a 20 20 20 20 69 66 28 20 64 77 53 69 7a 65  ;.    if( dwSize
193a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
193b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
193c0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 64 75  osCloseHandle(du
193d0 70 48 61 6e 64 6c 65 29 3b 0a 20 20 72 65 74 75  pHandle);.  retu
193e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
193f0 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20  ./* .** Windows 
19400 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f  will only let yo
19410 75 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69  u create file vi
19420 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f  ew mappings.** o
19430 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  n allocation siz
19440 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f  e granularity bo
19450 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72  undaries..** Dur
19460 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  ing sqlite3_os_i
19470 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65  nit() we do a Ge
19480 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a  tSystemInfo().**
19490 20 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e   to get the gran
194a0 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f  ularity size..*/
194b0 0a 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49  .static SYSTEM_I
194c0 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a  NFO winSysInfo;.
194d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
194e0 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
194f0 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
19500 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
19510 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
19520 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
19530 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
19540 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
19550 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e  ct the winLockIn
19560 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  fo objects used 
19570 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65  by .** this file
19580 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
19590 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20  ay be shared by 
195a0 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
195b0 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
195c0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
195d0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
195e0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
195f0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
19600 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
19610 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
19620 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
19630 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
19640 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
19650 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
19660 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
19670 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
19680 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
19690 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
196a0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
196b0 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
196c0 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
196d0 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
196e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
196f0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
19700 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
19710 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
19720 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
19730 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
19740 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
19750 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
19760 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19770 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19780 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
19790 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
197a0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75  tic int winShmMu
197b0 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
197c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
197d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
197e0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
197f0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19800 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
19810 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
19820 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
19830 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
19840 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
19850 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
19860 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
19870 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
19880 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
19890 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
198a0 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
198b0 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
198c0 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
198d0 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
198e0 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
198f0 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
19900 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
19910 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
19920 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
19930 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
19940 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
19950 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
19960 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19970 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
19980 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
19990 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
199a0 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
199b0 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
199c0 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
199d0 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
199e0 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
199f0 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a      pNext .**.**
19a00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
19a10 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
19a20 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
19a30 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
19a40 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
19a50 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
19a60 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
19a70 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  winShmNode.mutex
19a80 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
19a90 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
19aa0 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68  ==0 and.** winSh
19ab0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  mMutexHeld() is 
19ac0 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
19ad0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
19ae0 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
19af0 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
19b00 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20  e..**.*/.struct 
19b10 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73  winShmNode {.  s
19b20 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
19b30 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
19b40 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
19b50 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
19b60 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
19b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
19b80 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
19b90 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b    winFile hFile;
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19bb0 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
19bc0 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69   winOpen */..  i
19bd0 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
19be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
19bf0 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
19c00 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
19c10 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  int nRegion;    
19c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
19c30 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
19c40 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  gion */.  struct
19c50 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20   ShmRegion {.   
19c60 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
19c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
19c80 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72  e handle from Cr
19c90 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20  eateFileMapping 
19ca0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  */.    void *pMa
19cb0 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b  p;.  } *aRegion;
19cc0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
19cd0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
19ce0 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
19cf0 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
19d00 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20   I/O error */.. 
19d10 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
19d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19d30 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20  umber of winShm 
19d40 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
19d50 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
19d60 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  nShm *pFirst;   
19d70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
19d80 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
19d90 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
19da0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
19db0 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
19dc0 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20  /* Next in list 
19dd0 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
19de0 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  e objects */.#if
19df0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
19e00 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e20 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
19e30 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  winShm.id value 
19e40 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
19e50 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
19e60 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  ay of all winShm
19e70 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Node objects..**
19e80 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75  .** The winShmMu
19e90 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
19ea0 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
19eb0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
19ec0 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
19ed0 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20  atic winShmNode 
19ee0 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20  *winShmNodeList 
19ef0 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  = 0;../*.** Stru
19f00 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
19f10 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
19f20 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
19f30 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
19f40 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
19f50 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
19f60 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
19f70 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
19f80 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
19f90 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
19fa0 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
19fb0 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
19fc0 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77  fter:.**.**    w
19fd0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  inShm.pShmNode.*
19fe0 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a  *    winShm.id.*
19ff0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
1a000 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
1a010 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68  rite.  The winSh
1a020 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
1a030 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1a040 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1a050 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1a060 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1a070 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
1a080 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1a090 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
1a0a0 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
1a0b0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
1a0c0 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a0e0 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
1a0f0 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
1a100 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
1a110 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
1a120 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1a130 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
1a140 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
1a150 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
1a160 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a170 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1a180 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1a190 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
1a1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1a1b0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
1a1c0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
1a1d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1a1e0 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a200 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
1a210 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20  ection with its 
1a220 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65  winShmNode */.#e
1a230 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.};../*.** C
1a240 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
1a250 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
1a260 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53  fine WIN_SHM_BAS
1a270 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
1a280 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
1a290 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
1a2a0 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
1a2b0 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20  ne WIN_SHM_DMS  
1a2c0 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b    (WIN_SHM_BASE+
1a2d0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1a2e0 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
1a2f0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
1a300 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f  pply advisory lo
1a310 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79  cks for all n by
1a320 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  tes beginning at
1a330 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   ofst..*/.#defin
1a340 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a  e _SHM_UNLCK  1.
1a350 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c  #define _SHM_RDL
1a360 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53  CK  2.#define _S
1a370 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74  HM_WRLCK  3.stat
1a380 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73  ic int winShmSys
1a390 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68  temLock(.  winSh
1a3a0 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20  mNode *pFile,   
1a3b0 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1a3c0 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1a3d0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1a3e0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1a3f0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Type,         /*
1a400 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48   _SHM_UNLCK, _SH
1a410 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d  M_RDLCK, or _SHM
1a420 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
1a430 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
1a440 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66    /* Offset to f
1a450 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
1a460 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20  locked/unlocked 
1a470 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20  */.  int nByte  
1a480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a490 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1a4a0 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
1a4b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1a4c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a4d0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
1a4e0 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c  m Lock/UnlockFil
1a4f0 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  eEx() */..  /* A
1a500 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e  ccess to the win
1a510 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
1a520 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
1a530 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
1a540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a550 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
1a560 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c  ->mutex) || pFil
1a570 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
1a580 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1a590 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
1a5a0 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  k=%d, offset=%d,
1a5b0 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20   size=%d\n",.   
1a5c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
1a5d0 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65  File.h, lockType
1a5e0 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b  , ofst, nByte));
1a5f0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41  ..  /* Release/A
1a600 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65  cquire the syste
1a610 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a  m-level lock */.
1a620 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1a630 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  _SHM_UNLCK ){.  
1a640 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b    rc = winUnlock
1a650 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
1a660 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  le.h, ofst, 0, n
1a670 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Byte, 0);.  }els
1a680 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
1a690 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
1a6a0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1a6b0 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73     DWORD dwFlags
1a6c0 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c   = LOCKFILE_FAIL
1a6d0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20  _IMMEDIATELY;.  
1a6e0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
1a6f0 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  = _SHM_WRLCK ) d
1a700 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
1a710 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
1a720 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  K;.    rc = winL
1a730 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
1a740 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73  hFile.h, dwFlags
1a750 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
1a760 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  , 0);.  }.  .  i
1a770 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
1a780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1a7a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1a7b0 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
1a7c0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
1a7d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1a7e0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1a7f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e  OCK file=%p, fun
1a800 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c  c=%s, errno=%lu,
1a810 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1a820 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1a830 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20  le.h, (lockType 
1a840 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f  == _SHM_UNLCK) ?
1a850 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22   "winUnlockFile"
1a860 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77   :.           "w
1a870 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69  inLockFile", pFi
1a880 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73  le->lastErrno, s
1a890 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1a8a0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1a8b0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1a8c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
1a8d0 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
1a8e0 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
1a8f0 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
1a900 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
1a910 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
1a920 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
1a930 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
1a940 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
1a950 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
1a960 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
1a970 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1a980 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1a990 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
1a9a0 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
1a9b0 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
1a9c0 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1a9d0 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
1a9e0 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
1a9f0 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
1aa00 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1aa10 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
1aa20 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
1aa30 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1aa40 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
1aa50 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
1aa60 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
1aa70 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  de *p;.  assert(
1aa80 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1aa90 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  () );.  OSTRACE(
1aaa0 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d  ("SHM-PURGE pid=
1aab0 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d  %lu, deleteFlag=
1aac0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1aad0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1aae0 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74  ocessId(), delet
1aaf0 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20  eFlag));.  pp = 
1ab00 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
1ab10 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
1ab20 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
1ab30 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
1ab40 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1ab50 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
1ab60 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ){ sqlite3_mutex
1ab70 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1ab80 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
1ab90 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
1aba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f  i++){.        BO
1abb0 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70  OL bRc = osUnmap
1abc0 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
1abd0 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
1abe0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1abf0 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41  ("SHM-PURGE-UNMA
1ac00 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1ac10 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1ac40 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1ac50 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1ac60 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1ac70 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1ac80 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1ac90 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
1aca0 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
1acb0 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
1acc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1acd0 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64  -PURGE-CLOSE pid
1ace0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1acf0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1ad10 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ad20 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1ad30 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1ad40 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1ad50 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1ad60 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Rc);.      }.   
1ad70 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
1ad80 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46  h!=NULL && p->hF
1ad90 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  ile.h!=INVALID_H
1ada0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
1adb0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1adc0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1add0 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
1ade0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1adf0 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
1ae00 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ae10 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1ae20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ae30 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
1ae40 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1ae50 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1ae60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ae70 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1ae80 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
1ae90 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
1aea0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
1aeb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aec0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
1aed0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1aee0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1aef0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1af00 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1af10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1af20 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
1af30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1af40 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
1af50 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
1af60 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
1af70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
1af80 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
1af90 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
1afa0 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
1afb0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
1afc0 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
1afd0 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
1afe0 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
1aff0 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
1b000 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
1b010 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
1b020 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
1b030 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
1b040 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
1b050 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
1b060 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
1b070 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
1b080 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
1b090 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
1b0a0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
1b0b0 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
1b0c0 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
1b0d0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1b100 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
1b110 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
1b120 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1b130 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
1b140 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1b150 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1b160 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1b190 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
1b1a0 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1b1b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
1b1c0 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
1b1d0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
1b1e0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b200 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
1b210 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
1b220 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
1b230 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
1b240 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1b250 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
1b260 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1b270 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
1b280 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
1b290 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
1b2a0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
1b2b0 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
1b2c0 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
1b2d0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
1b2e0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1b2f0 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  ro( sizeof(*p) )
1b300 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1b310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b320 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d  RR_NOMEM;.  nNam
1b330 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
1b340 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  n30(pDbFd->zPath
1b350 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
1b360 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1b370 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1b380 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b   + nName + 17 );
1b390 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1b3a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1b3b0 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
1b3c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1b3d0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  OMEM;.  }.  pNew
1b3e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
1b3f0 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
1b400 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1b410 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
1b420 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
1b430 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
1b440 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ath);.  sqlite3F
1b450 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
1b460 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a  ->zPath, pNew->z
1b470 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f  Filename); ..  /
1b480 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
1b490 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
1b4a0 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
1b4b0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1b4c0 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1b4d0 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
1b4e0 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
1b4f0 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
1b500 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
1b510 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1b520 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
1b530 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1b540 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
1b550 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
1b560 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
1b570 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
1b580 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
1b590 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
1b5a0 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
1b5b0 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
1b5c0 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
1b5d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1b5e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
1b5f0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1b600 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1b610 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
1b620 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
1b630 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1b640 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
1b650 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
1b660 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
1b670 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
1b680 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
1b690 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
1b6a0 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
1b6b0 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
1b6c0 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
1b6d0 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
1b6e0 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1b6f0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
1b700 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1b710 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1b720 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1b730 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
1b740 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1b750 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
1b760 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1b770 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1b780 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1b790 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1b7a0 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
1b7b0 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
1b7c0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1b7d0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
1b7e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1b7f0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
1b800 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
1b810 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1b820 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
1b830 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
1b840 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
1b850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b860 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
1b870 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
1b880 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
1b890 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
1b8c0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1b8d0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1b8e0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
1b8f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1b900 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
1b910 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1b920 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
1b930 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
1b940 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
1b950 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1b960 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
1b970 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
1b980 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1b990 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
1b9a0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
1b9b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b9c0 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
1b9d0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1b9e0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1b9f0 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
1ba00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ba10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ba20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1ba30 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1ba40 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1ba50 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1ba70 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46 64  nOpenShm", pDbFd
1ba80 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1ba90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1baa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bab0 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73  .      winShmSys
1bac0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1bad0 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  , _SHM_UNLCK, WI
1bae0 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1baf0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1bb00 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1bb10 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1bb20 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1bb30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bb40 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
1bb50 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
1bb60 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
1bb70 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
1bb80 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e  d of the winShmN
1bb90 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
1bba0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
1bbb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1bbc0 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
1bbd0 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
1bbe0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
1bbf0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
1bc00 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1bc10 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   p;.  winShmLeav
1bc20 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
1bc30 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
1bc40 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
1bc50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1bc60 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
1bc70 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
1bc80 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45  r of the winShmE
1bc90 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
1bca0 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
1bcb0 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
1bcc0 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53  new (struct winS
1bcd0 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
1bce0 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
1bcf0 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
1bd00 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
1bd10 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
1bd20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1bd30 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
1bd40 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
1bd50 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
1bd60 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
1bd70 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
1bd80 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
1bd90 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
1bda0 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
1bdb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1bdc0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1bdd0 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
1bde0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1bdf0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
1be00 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
1be10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1be20 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1be30 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1be40 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1be50 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
1be60 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
1be70 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
1be80 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1be90 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1bea0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1beb0 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1bec0 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
1bed0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1bee0 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1bef0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1bf00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1bf10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1bf20 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
1bf30 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1bf40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf50 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1bf60 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1bf70 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1bf80 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1bf90 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
1bfa0 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
1bfb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1bfc0 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20   winShmUnmap(.  
1bfd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1bfe0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1bff0 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
1c000 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1c010 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c030 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f  Delete after clo
1c040 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  sing if true */.
1c050 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1c060 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  bFd;       /* Da
1c070 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
1c080 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
1c090 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20    winShm *p;    
1c0a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1c0b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
1c0c0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53  closed */.  winS
1c0d0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1c0e0 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79  ; /* The underly
1c0f0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1c100 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53  y file */.  winS
1c110 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
1c120 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1c130 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
1c140 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  nnections */..  
1c150 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1c160 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
1c170 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
1c180 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1c190 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
1c1a0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1c1b0 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
1c1c0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
1c1d0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
1c1e0 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
1c1f0 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
1c200 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
1c210 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1c220 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1c230 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
1c240 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
1c250 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
1c260 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
1c270 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
1c280 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
1c290 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
1c2a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1c2b0 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1c2c0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
1c2d0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1c2e0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
1c2f0 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
1c300 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
1c310 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
1c320 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
1c330 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1c340 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77  file, too */.  w
1c350 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1c360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
1c370 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
1c380 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1c390 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
1c3a0 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
1c3b0 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28      winShmPurge(
1c3c0 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c  pDbFd->pVfs, del
1c3d0 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20  eteFlag);.  }.  
1c3e0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1c3f0 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
1c400 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c410 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
1c420 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
1c430 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1c440 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1c450 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20  nt winShmLock(. 
1c460 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1c470 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
1c480 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
1c490 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
1c4a0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
1c4b0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
1c4c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1c4d0 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
1c4e0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
1c4f0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
1c500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c510 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
1c520 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
1c530 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
1c540 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1c550 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1c560 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
1c570 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1c580 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c  *pDbFd = (winFil
1c590 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a  e*)fd;        /*
1c5a0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
1c5b0 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1c5c0 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
1c5d0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5f0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
1c600 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
1c610 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20  /.  winShm *pX; 
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1c640 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
1c650 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
1c660 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1c670 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1c680 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1c690 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1c6b0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1c6c0 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1c6f0 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
1c700 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
1c710 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
1c720 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
1c730 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
1c740 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
1c750 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
1c760 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
1c770 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1c780 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
1c790 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1c7a0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
1c7b0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1c7c0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
1c7d0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
1c7e0 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
1c7f0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1c800 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1c810 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
1c820 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1c830 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
1c840 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
1c850 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1c860 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
1c870 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29  ..  mask = (u16)
1c880 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  ((1U<<(ofst+n)) 
1c890 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20  - (1U<<ofst));. 
1c8a0 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
1c8b0 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
1c8c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1c8d0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1c8e0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
1c8f0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1c900 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
1c910 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
1c920 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
1c930 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
1c940 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
1c950 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
1c960 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
1c970 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
1c980 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1c990 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1c9a0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1c9b0 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
1c9c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
1c9d0 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
1c9e0 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
1c9f0 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
1ca00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
1ca10 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
1ca20 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
1ca30 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
1ca40 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1ca50 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1ca60 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
1ca70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1ca80 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1ca90 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1caa0 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_UNLCK, ofst+WI
1cab0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1cac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1caf0 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
1cb00 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
1cb10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cb20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
1cb30 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1cb40 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
1cb50 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
1cb60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
1cb70 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1cb80 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
1cb90 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
1cba0 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
1cbb0 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
1cbc0 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
1cbd0 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
1cbe0 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
1cbf0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
1cc00 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
1cc10 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
1cc20 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
1cc30 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
1cc40 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
1cc50 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
1cc60 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
1cc70 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
1cc80 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
1cc90 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1cca0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1ccb0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1ccc0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1ccd0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1cce0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ccf0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1cd00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cd10 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
1cd20 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
1cd30 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1cd40 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
1cd50 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
1cd60 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
1cd70 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
1cd80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cd90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
1cda0 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
1cdb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1cdc0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1cdd0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1cde0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_RDLCK, ofst+
1cdf0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1ce00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ce10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ce20 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1ce30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1ce40 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
1ce50 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
1ce60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ce70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
1ce80 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1ce90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1cea0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1ceb0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
1cec0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
1ced0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
1cee0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
1cef0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
1cf00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1cf10 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
1cf20 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1cf30 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1cf40 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1cf50 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1cf60 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1cf70 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
1cf80 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1cf90 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
1cfa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1cfb0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
1cfc0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1cfd0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
1cfe0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
1cff0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1d000 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
1d010 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
1d020 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
1d030 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
1d040 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
1d050 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1d060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d070 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1d080 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1d090 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
1d0a0 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  RLCK, ofst+WIN_S
1d0b0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1d0c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d0d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d0e0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
1d0f0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
1d100 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
1d110 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
1d120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d130 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1d140 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1d150 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
1d160 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1d170 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c   pid=%lu, id=%d,
1d180 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78   sharedMask=%03x
1d190 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c  , exclMask=%03x,
1d1a0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d1b0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1d1c0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1d1d0 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d  ->id, p->sharedM
1d1e0 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
1d1f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
1d200 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1d210 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d220 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1d230 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
1d240 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
1d250 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
1d260 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
1d270 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
1d280 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
1d290 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
1d2a0 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
1d2b0 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
1d2c0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
1d2d0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
1d2e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1d2f0 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  nShmBarrier(.  s
1d300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
1d310 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1d320 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
1d330 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1d340 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
1d350 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f  RAMETER(fd);.  /
1d360 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  * MemoryBarrier(
1d370 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77  ); // does not w
1d380 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e  ork -- do not kn
1d390 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20  ow why not */.  
1d3a0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1d3b0 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  ();.  winShmLeav
1d3c0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
1d3d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d3e0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
1d3f0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
1d400 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
1d410 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
1d420 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
1d430 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
1d440 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
1d450 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
1d460 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
1d470 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1d480 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1d490 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d4a0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1d4b0 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
1d4c0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
1d4d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1d4e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1d4f0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
1d500 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1d510 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1d520 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
1d530 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
1d540 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1d550 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
1d560 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
1d570 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d580 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
1d590 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
1d5a0 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
1d5b0 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
1d5c0 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
1d5d0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
1d5e0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d5f0 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20   If .** isWrite 
1d600 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
1d610 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1d620 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1d630 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
1d640 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
1d650 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
1d660 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1d670 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
1d680 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1d690 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
1d6a0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
1d6b0 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
1d6c0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
1d6d0 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
1d6e0 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
1d6f0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1d700 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
1d710 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
1d720 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1d730 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
1d740 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1d750 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
1d760 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
1d770 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1d780 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
1d790 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1d7a0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1d7b0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1d7c0 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
1d7d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
1d7e0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1d7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d800 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
1d810 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1d820 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1d830 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1d840 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
1d850 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d870 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
1d880 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
1d890 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
1d8a0 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
1d8b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1d8c0 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
1d8d0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1d8e0 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1d8f0 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
1d900 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1d910 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1d920 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1d930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d940 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63  if( !p ){.    rc
1d950 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64   = winOpenShared
1d960 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
1d970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d980 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1d990 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d  ;.    p = pDbFd-
1d9a0 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
1d9b0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1d9c0 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ode;..  sqlite3_
1d9d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1d9e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1d9f0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
1da00 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
1da10 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
1da20 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
1da30 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1da40 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1da50 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  n ){.    struct 
1da60 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77  ShmRegion *apNew
1da70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1da80 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72  ew aRegion[] arr
1da90 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
1daa0 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
1dab0 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
1dac0 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
1dad0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1dae0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1daf0 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
1db00 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1db10 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65  size of wal-inde
1db20 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70  x file */..    p
1db30 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
1db40 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
1db50 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1db60 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
1db70 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
1db80 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1db90 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
1dba0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1dbb0 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
1dbc0 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
1dbd0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
1dbe0 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c  file is.    ** l
1dbf0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
1dc00 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
1dc10 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
1dc20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69    */.    rc = wi
1dc30 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
1dc40 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
1dc50 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29  ode->hFile, &sz)
1dc60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1dc70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dc80 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1dc90 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1dca0 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1dcb0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70   "winShmMap1", p
1dce0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1dcf0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1dd00 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
1dd10 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b   if( sz<nByte ){
1dd20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
1dd30 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1dd40 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
1dd50 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65  xist. If isWrite
1dd60 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
1dd70 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65   ** zero, exit e
1dd80 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
1dd90 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
1dda0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1ddb0 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rned..      **. 
1ddc0 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
1ddd0 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74  ively, if isWrit
1dde0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75  e is non-zero, u
1ddf0 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
1de00 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
1de10 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
1de20 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
1de30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1de40 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67  if( !isWrite ) g
1de50 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1de60 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1de70 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1de80 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1de90 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29  e->hFile, nByte)
1dea0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1deb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dec0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1ded0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1dee0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1def0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1df20 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p2", pDbFd->zPat
1df30 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  h);.        goto
1df40 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1df50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1df60 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
1df70 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1df80 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
1df90 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
1dfa0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
1dfb0 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68  New = (struct Sh
1dfc0 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65  mRegion *)sqlite
1dfd0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
1dfe0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1dff0 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
1e000 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
1e010 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
1e020 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1e030 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1e040 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1e050 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1e060 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
1e070 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d  mNode->aRegion =
1e080 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69   apNew;..    whi
1e090 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
1e0a0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
1e0b0 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  {.      HANDLE h
1e0c0 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  Map = NULL;     
1e0d0 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70      /* file-mapp
1e0e0 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ing handle */.  
1e0f0 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d      void *pMap =
1e100 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e110 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  /* Mapped memory
1e120 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   region */.     
1e130 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1e140 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1e150 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1e160 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1e170 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1e180 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1e190 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1e1a0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1e1b0 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1e1c0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1e1d0 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1e1e0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1e1f0 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1e200 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
1e210 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1e220 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1e230 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1e240 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1e250 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1e260 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1e270 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1e280 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1e290 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1e2a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
1e2b0 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1e2c0 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1e2d0 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
1e2e0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
1e2f0 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45  ("SHM-MAP-CREATE
1e300 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1e310 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1e320 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e330 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1e340 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e350 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e360 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
1e370 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
1e380 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1e390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
1e3a0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
1e3b0 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
1e3c0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
1e3d0 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
1e3e0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1e3f0 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1e400 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1e410 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1e420 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1e430 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70  NRT.        pMap
1e440 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1e450 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20  leFromApp(hMap, 
1e460 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
1e470 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
1e480 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
1e490 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
1e4a0 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
1e4b0 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
1e4c0 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
1e4d0 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
1e4e0 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
1e4f0 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
1e500 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
1e510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
1e520 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1e530 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1e540 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1e550 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  .        );.#end
1e560 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  if.        OSTRA
1e570 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50  CE(("SHM-MAP-MAP
1e580 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1e590 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20  =%d, offset=%d, 
1e5a0 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  size=%d, rc=%s\n
1e5b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e5c0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1e5d0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1e5e0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1e5f0 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  iOffset,.       
1e600 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69            szRegi
1e610 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20  on, pMap ? "ok" 
1e620 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1e630 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e640 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
1e650 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1e660 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1e670 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1e680 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1e690 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1e6a0 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d  HMMAP, pShmNode-
1e6b0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
1e6e0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1e6f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
1e700 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
1e710 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
1e720 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1e730 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
1e740 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1e750 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1e760 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
1e770 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1e780 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1e790 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1e7a0 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
1e7b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
1e7c0 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
1e7d0 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
1e7e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1e7f0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
1e800 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
1e810 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
1e820 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
1e830 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1e840 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1e850 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1e860 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
1e870 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
1e880 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
1e890 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
1e8a0 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
1e8b0 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
1e8c0 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
1e8d0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
1e8e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e8f0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1e900 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1e910 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
1e920 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
1e930 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
1e940 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
1e950 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1e960 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
1e970 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
1e980 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
1e990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e9a0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
1e9b0 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70  leans up the map
1e9c0 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68  ped region of th
1e9d0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1e9e0 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66  , if any..*/.#if
1e9f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ea00 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
1ea10 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
1ea20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
1ea30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1ea40 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
1ea50 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1ea60 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1ea70 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65   hMap=%p, pMapRe
1ea80 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1ea90 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d        "mmapSize=
1eaa0 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63  %lld, mmapSizeAc
1eab0 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  tual=%lld, mmapS
1eac0 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a  izeMax=%lld\n",.
1ead0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1eae0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1eaf0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1eb00 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70  ->hMap, pFile->p
1eb10 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20  MapRegion,.     
1eb20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1eb30 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d  pSize, pFile->mm
1eb40 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46  apSizeActual, pF
1eb50 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1eb60 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ));.  if( pFile-
1eb70 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
1eb80 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56     if( !osUnmapV
1eb90 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
1eba0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a  >pMapRegion) ){.
1ebb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1ebc0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1ebd0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1ebe0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1ebf0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1ec00 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
1ec10 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1ec20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
1ec30 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
1ec40 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
1ec50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1ec60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1ec70 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1ec80 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
1ec90 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1eca0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1ecb0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1ecc0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1ece0 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70  inUnmapfile1", p
1ecf0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1ed00 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70    }.    pFile->p
1ed10 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
1ed20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1ed30 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ze = 0;.    pFil
1ed40 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1ed50 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  l = 0;.  }.  if(
1ed60 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55   pFile->hMap!=NU
1ed70 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  LL ){.    if( !o
1ed80 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
1ed90 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20  le->hMap) ){.   
1eda0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1edb0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1edc0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
1edd0 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1ede0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1edf0 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72  e=%p, hMap=%p, r
1ee00 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ee10 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  MAP\n",.        
1ee20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1ee30 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ee40 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
1ee50 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ap));.      retu
1ee60 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1ee70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1ee80 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1ee90 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1eeb0 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46  nUnmapfile2", pF
1eec0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1eed0 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d   }.    pFile->hM
1eee0 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  ap = NULL;.  }. 
1eef0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1ef00 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1ef10 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1ef20 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1ef30 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ef40 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1ef50 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
1ef60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1ef70 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
1ef80 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
1ef90 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
1efa0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
1efb0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
1efc0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
1efd0 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
1efe0 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
1eff0 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
1f000 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
1f010 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
1f020 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
1f030 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
1f040 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
1f050 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1f060 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
1f070 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
1f080 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1f090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1f0a0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
1f0b0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
1f0c0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
1f0d0 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
1f0e0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
1f0f0 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
1f100 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
1f110 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
1f120 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
1f130 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
1f140 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1f150 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
1f160 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1f170 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
1f180 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
1f190 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
1f1a0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
1f1b0 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
1f1c0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
1f1d0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69  L_MMAP_SIZE, whi
1f1e0 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
1f1f0 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
1f200 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1f210 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f220 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
1f230 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
1f240 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
1f250 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
1f260 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1f270 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
1f280 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
1f290 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1f2a0 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
1f2b0 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73  (winFile *pFd, s
1f2c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
1f2d0 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  te){.  sqlite3_i
1f2e0 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74  nt64 nMap = nByt
1f2f0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
1f300 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
1f310 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
1f320 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  t==0 );.  OSTRAC
1f330 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
1f340 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1f350 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  size=%lld\n",.  
1f360 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f370 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f380 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a  , pFd, nByte));.
1f390 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
1f3a0 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
1f3b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1f3c0 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
1f3d0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1f3e0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
1f3f0 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20  )pFd, &nMap);.  
1f400 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f410 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1f420 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1f430 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1f440 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22  E_IOERR_FSTAT\n"
1f450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f460 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f470 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1f480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f490 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f4a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1f4b0 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
1f4c0 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
1f4d0 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
1f4e0 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d  izeMax;.  }.  nM
1f4f0 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f  ap &= ~(sqlite3_
1f500 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66  int64)(winSysInf
1f510 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31  o.dwPageSize - 1
1f520 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d  );. .  if( nMap=
1f530 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53  =0 && pFd->mmapS
1f540 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e  ize>0 ){.    win
1f550 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1f560 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d    }.  if( nMap!=
1f570 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  pFd->mmapSize ){
1f580 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1f590 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70  = 0;.    DWORD p
1f5a0 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
1f5b0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52  ADONLY;.    DWOR
1f5c0 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d  D flags = FILE_M
1f5d0 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69  AP_READ;..    wi
1f5e0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1f5f0 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63  .    if( (pFd->c
1f600 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
1f610 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  LE_RDONLY)==0 ){
1f620 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d  .      protect =
1f630 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b   PAGE_READWRITE;
1f640 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
1f650 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a  FILE_MAP_WRITE;.
1f660 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
1f670 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46  _OS_WINRT.    pF
1f680 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1f690 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
1f6a0 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  mApp(pFd->h, NUL
1f6b0 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70  L, protect, nMap
1f6c0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64  , NULL);.#elif d
1f6d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1f6e0 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1f6f0 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1f700 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1f710 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  gW(pFd->h, NULL,
1f720 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20   protect,.      
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1f750 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30  )((nMap>>32) & 0
1f760 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20  xffffffff),.    
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1f790 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66  RD)(nMap & 0xfff
1f7a0 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23  fffff), NULL);.#
1f7b0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1f7c0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1f7d0 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  SI).    pFd->hMa
1f7e0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1f7f0 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c  MappingA(pFd->h,
1f800 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1f840 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1f850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1f880 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1f890 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
1f8a0 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e  if( pFd->hMap==N
1f8b0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64  ULL ){.      pFd
1f8c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1f8d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1f8e0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1f8f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1f900 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
1f910 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20   "winMapfile1", 
1f940 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1f950 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
1f960 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
1f970 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
1f980 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
1f990 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
1f9a0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1f9b0 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  E-CREATE pid=%lu
1f9c0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
1f9d0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1f9e0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f9f0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1fa00 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
1fa10 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1fa20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fa30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1fa40 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79  t( (nMap % winSy
1fa50 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1fa60 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
1fa70 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
1fa80 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
1fa90 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61  e3_int64) || nMa
1faa0 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b  p<=0xffffffff );
1fab0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1fac0 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20  INRT.    pNew = 
1fad0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1fae0 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70  romApp(pFd->hMap
1faf0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a  , flags, 0, (SIZ
1fb00 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65  E_T)nMap);.#else
1fb10 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1fb20 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d  pViewOfFile(pFd-
1fb30 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1fb40 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
1fb50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1fb60 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
1fb70 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e        osCloseHan
1fb80 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a  dle(pFd->hMap);.
1fb90 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20        pFd->hMap 
1fba0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46  = NULL;.      pF
1fbb0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
1fbc0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1fbd0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1fbe0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1fbf0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e  OERR_MMAP, pFd->
1fc00 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c    "winMapfile2",
1fc30 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20   pFd->zPath);.  
1fc40 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65      /* Log the e
1fc50 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e  rror, but contin
1fc60 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ue normal operat
1fc70 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f  ion using xRead/
1fc80 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  xWrite */.      
1fc90 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1fca0 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  LE-MAP pid=%lu, 
1fcb0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
1fcc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1fcd0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1fce0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1fcf0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1fd00 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
1fd10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fd20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d     }.    pFd->pM
1fd30 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b  apRegion = pNew;
1fd40 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
1fd50 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70  ze = nMap;.    p
1fd60 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
1fd70 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a  al = nMap;.  }..
1fd80 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1fd90 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1fda0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1fdb0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1fdc0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1fdd0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1fde0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1fdf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1fe00 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
1fe10 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
1fe20 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65  *.** If possible
1fe30 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
1fe40 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20  er to a mapping 
1fe50 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74  of file fd start
1fe60 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  ing at offset.**
1fe70 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69   iOff. The mappi
1fe80 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  ng must be valid
1fe90 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41   for at least nA
1fea0 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  mt bytes..**.** 
1feb0 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65  If such a pointe
1fec0 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65  r can be obtaine
1fed0 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  d, store it in *
1fee0 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  pp and return SQ
1fef0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
1ff00 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75  if one cannot bu
1ff10 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1ff20 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20  s, set *pp to 0 
1ff30 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1ff40 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79  E_OK..** Finally
1ff50 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  , if an error do
1ff60 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e  es occur, return
1ff70 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ff80 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
1ff90 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70  .** value of *pp
1ffa0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1ffb0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1ffc0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
1ffd0 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61  on does return a
1ffe0 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61   pointer, the ca
1fff0 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75  ller must eventu
20000 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65  ally .** release
20010 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62   the reference b
20020 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66  y calling winUnf
20030 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
20040 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73  c int winFetch(s
20050 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
20060 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e   i64 iOff, int n
20070 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  Amt, void **pp){
20080 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
20090 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
200a0 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
200b0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
200c0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
200d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
200e0 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
200f0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  ;..  OSTRACE(("F
20100 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
20110 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
20120 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  lld, amount=%d, 
20130 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  pp=%p\n",.      
20140 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20150 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
20160 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70  , iOff, nAmt, pp
20170 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
20180 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
20190 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
201a0 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20  izeMax>0 ){.    
201b0 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
201c0 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
201d0 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66  int rc = winMapf
201e0 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
201f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20210 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
20220 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
20230 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
20250 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20260 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c  ssId(), pFd, sql
20270 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
20280 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20290 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
202a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
202b0 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
202c0 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
202d0 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
202e0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
202f0 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
20300 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
20310 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
20320 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
20330 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20340 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d  =%p, pp=%p, *pp=
20350 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
20360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20370 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20380 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c  essId(), fd, pp,
20390 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e   *pp));.  return
203a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
203b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
203c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
203d0 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
203e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
203f0 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65  ses a .** refere
20400 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
20410 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
20420 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
20430 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
20440 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
20450 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
20460 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
20470 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
20480 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
20490 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
204a0 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
204b0 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a  ) invocation. .*
204c0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
204d0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
204e0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
204f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
20500 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74  ing called .** t
20510 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53  o inform the VFS
20520 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63   layer that, acc
20530 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c  ording to POSIX,
20540 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   any existing ma
20550 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f  pping .** may no
20560 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64  w be invalid and
20570 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70   should be unmap
20580 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
20590 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71  nt winUnfetch(sq
205a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
205b0 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
205c0 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
205d0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
205e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
205f0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
20600 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
20610 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
20620 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  */..  /* If p==0
20630 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
20640 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
20650 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
20660 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
20670 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
20680 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
20690 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
206a0 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
206b0 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
206c0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
206d0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
206e0 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
206f0 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
20700 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
20710 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
20720 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
20730 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
20740 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
20750 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
20760 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
20770 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53  )[iOff] );..  OS
20780 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
20790 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
207a0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
207b0 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
207c0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
207d0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
207e0 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20  , iOff, p));..  
207f0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
20800 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
20810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
20820 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77  IXME:  If Window
20830 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70  s truly always p
20840 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69  revents truncati
20850 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61  ng or deleting a
20860 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69  .    ** file whi
20870 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20  le a mapping is 
20880 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66  held, then the f
20890 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61  ollowing winUnma
208a0 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20  pfile() call.   
208b0 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61   ** is unnecessa
208c0 72 79 20 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d  ry can can be om
208d0 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61  itted - potentia
208e0 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20  lly improving.  
208f0 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65    ** performance
20900 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d  .  */.    winUnm
20910 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
20920 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
20930 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
20940 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
20950 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64  CE(("UNFETCH pid
20960 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20970 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
20980 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20990 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
209a0 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74  d(), fd));.  ret
209b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
209c0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
209d0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
209e0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
209f0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
20a00 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
20a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
20a20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
20a30 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
20a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a50 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
20a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20aa0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
20ab0 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
20ac0 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
20ad0 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
20ae0 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
20af0 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
20b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
20b10 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
20b20 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
20b30 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
20b60 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
20b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20b80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
20b90 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
20bc0 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
20bf0 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
20c20 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
20c50 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
20c80 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
20cb0 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
20ce0 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
20cf0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
20d00 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
20d10 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
20d20 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d40 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
20d50 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
20d60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20d70 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
20d80 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
20d90 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20da0 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
20db0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20dc0 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
20dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20de0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
20df0 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
20e00 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20e10 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
20e20 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
20e30 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
20e40 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
20e50 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
20e60 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
20e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20e80 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
20e90 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nFetch,         
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20eb0 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e   xFetch */.  win
20ec0 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ee0 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a  xUnfetch */.};..
20ef0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
20f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
20f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
20f60 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
20f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
20f90 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
20fa0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
20fb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
20fc0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
20fd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
20fe0 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ect..*/..#if def
20ff0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
21000 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
21010 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
21020 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
21030 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
21040 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
21050 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
21060 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
21070 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21080 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
21090 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
210a0 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
210b0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
210c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
210d0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
210e0 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
210f0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
21100 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
21110 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
21120 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
21130 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
21140 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
21150 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
21160 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
21170 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
21180 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
21190 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
211a0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
211b0 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c  bcs_to_utf8(zFil
211c0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
211d0 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
211e0 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
211f0 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
21200 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
21210 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21220 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
21230 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
21240 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
21250 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
21260 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
21270 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
21280 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
21290 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
212a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
212b0 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
212c0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
212d0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
212e0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
212f0 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
21300 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
21310 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
21320 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
21330 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
21340 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
21350 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
21360 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
21370 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
21380 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
21390 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
213a0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
213b0 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
213c0 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
213d0 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
213e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
213f0 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
21400 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
21410 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
21420 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
21430 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21440 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
21450 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
21460 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
21470 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
21480 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
21490 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
214a0 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
214b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
214c0 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
214d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
214e0 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
214f0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
21500 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
21510 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
21520 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21530 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
21540 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
21550 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
21560 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
21570 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21580 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
21590 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
215a0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
215b0 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
215c0 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
215d0 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
215e0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
215f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
21600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21610 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
21620 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
21630 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
21640 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
21650 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
21660 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
21670 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
21680 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
21690 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
216a0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
216b0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
216c0 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
216d0 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
216e0 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
216f0 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
21700 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
21710 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
21720 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
21730 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
21740 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
21750 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
21760 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65  i, j;.  int nPre
21770 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21780 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
21790 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ILE_PREFIX);.  i
217a0 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e  nt nMax, nBuf, n
217b0 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Dir, nLen;.  cha
217c0 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
217d0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
217e0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
217f0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
21800 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
21810 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
21820 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
21830 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
21840 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
21850 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
21860 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
21870 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
21880 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
21890 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
218a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
218b0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
218c0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
218d0 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
218e0 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  .  ** name for t
218f0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
21900 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  e.  If this fail
21910 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  s, we cannot con
21920 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  tinue..  */.  nM
21930 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  ax = pVfs->mxPat
21940 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d  hname; nBuf = nM
21950 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d  ax + 2;.  zBuf =
21960 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
21970 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66  ro( nBuf );.  if
21980 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f  ( !zBuf ){.    O
21990 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
219a0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
219b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
219c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
219d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
219e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
219f0 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
21a00 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64  tive temporary d
21a10 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74  irectory.  First
21a20 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20  , check if one. 
21a30 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70   ** has been exp
21a40 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74  licitly set by t
21a50 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20  he application; 
21a60 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  otherwise, use t
21a70 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66  he one.  ** conf
21a80 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70  igured by the op
21a90 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a  erating system..
21aa0 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d    */.  nDir = nM
21ab0 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29  ax - (nPre + 15)
21ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72  ;.  assert( nDir
21ad0 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  >0 );.  if( sqli
21ae0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
21af0 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44  ry ){.    int nD
21b00 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  irLen = sqlite3S
21b10 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f  trlen30(sqlite3_
21b20 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
21b30 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e  .    if( nDirLen
21b40 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
21b50 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c  !winIsDirSep(sql
21b60 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21b70 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20  ory[nDirLen-1]) 
21b80 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c  ){.        nDirL
21b90 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  en++;.      }.  
21ba0 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
21bb0 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nDir ){.        
21bc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
21bd0 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  f);.        OSTR
21be0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
21bf0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
21c00 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ROR\n"));.      
21c10 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
21c20 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
21c30 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
21c40 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20  pname1", 0);.   
21c50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
21c60 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
21c70 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71  , zBuf, "%s", sq
21c80 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
21c90 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tory);.    }.  }
21ca0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
21cb0 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b  YGWIN__).  else{
21cc0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
21cd0 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
21ce0 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f   = {.       0, /
21cf0 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  * getenv("SQLITE
21d00 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  _TMPDIR") */.   
21d10 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21d20 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  ("TMPDIR") */.  
21d30 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
21d40 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20  v("TMP") */.    
21d50 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
21d60 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  "TEMP") */.     
21d70 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
21d80 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f  USERPROFILE") */
21d90 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  .       "/var/tm
21da0 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72  p",.       "/usr
21db0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
21dc0 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22  tmp",.       "."
21dd0 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ,.       0      
21de0 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
21df0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  ator */.    };. 
21e00 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
21e10 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  i;.    const cha
21e20 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
21e30 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
21e40 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
21e50 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
21e60 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
21e70 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
21e80 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
21e90 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  "TMPDIR");.    i
21ea0 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20  f( !azDirs[2] ) 
21eb0 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65  azDirs[2] = gete
21ec0 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69  nv("TMP");.    i
21ed0 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20  f( !azDirs[3] ) 
21ee0 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65  azDirs[3] = gete
21ef0 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20  nv("TEMP");.    
21f00 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29  if( !azDirs[4] )
21f10 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74   azDirs[4] = get
21f20 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
21f30 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
21f40 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
21f50 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
21f60 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
21f70 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f  [i++]){.      vo
21f80 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
21f90 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d        if( zDir==
21fa0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
21fb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
21fc0 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61  th starts with a
21fd0 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f   drive letter fo
21fe0 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f  llowed by the co
21ff0 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  lon.      ** cha
22000 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69  racter, assume i
22010 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e  t is already a n
22020 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
22030 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  ; otherwise,.   
22040 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65     ** it must be
22050 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
22060 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
22070 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e  h via the Cygwin
22080 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72   API.      ** pr
22090 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e  ior to using it.
220a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
220b0 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  if( winIsDriveLe
220c0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69  tterAndColon(zDi
220d0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  r) ){.        zC
220e0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
220f0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
22100 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20  ename(zDir);.   
22110 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
22120 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
22130 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22140 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
22150 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22160 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22170 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22180 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22190 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
221a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
221b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
221c0 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
221d0 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
221e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
221f0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22200 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20  s", zDir);.     
22210 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22220 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22230 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22260 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22280 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
22290 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
222a0 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20   nMax+1 );.     
222b0 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74     if( !zConvert
222c0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
222d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
222e0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
222f0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22300 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22310 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22320 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
22330 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22340 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
22350 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67  .        if( cyg
22360 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
22380 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
22390 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
223a0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
223b0 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20  A, zDir,.       
223c0 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72           zConver
223d0 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29  ted, nMax+1)<0 )
223e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
223f0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22400 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
22410 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22420 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
22430 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22440 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22450 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e  IOERR_CONVPATH\n
22460 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
22470 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
22480 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  r(SQLITE_IOERR_C
22490 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
224a0 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
224d0 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20  ame2", zDir);.  
224e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
224f0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
22500 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
22510 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
22520 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
22530 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69  the candidate di
22540 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61  rectory exists a
22550 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20  nd should.      
22560 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20      ** be used. 
22570 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79   However, we may
22580 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   need to convert
22590 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74   the string cont
225a0 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  aining.         
225b0 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74   ** its name int
225c0 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66  o UTF-8 (i.e. if
225d0 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69   it is UTF-16 ri
225e0 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20  ght now)..      
225f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22600 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
22610 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
22620 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74  ilename(zConvert
22630 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ed);.          i
22640 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
22650 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22660 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
22680 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f  );.            O
226a0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
226b0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
226c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
226d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
226e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
226f0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
22700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22710 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22720 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
22730 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
22740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22750 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
22760 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22770 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22780 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
227a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
227b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
227c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c   }.    }.  }.#el
227d0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
227e0 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
227f0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
22800 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  se if( osIsNT() 
22810 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
22820 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20  lti;.    LPWSTR 
22830 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69  zWidePath = sqli
22840 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
22850 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  Max*sizeof(WCHAR
22860 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57  ) );.    if( !zW
22870 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  idePath ){.     
22880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22890 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
228a0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
228b0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
228c0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
228d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
228e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
228f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
22900 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
22910 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
22920 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22930 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
22940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22950 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22960 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22970 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22980 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
22990 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
229a0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
229b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
229c0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
229d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
229e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
229f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
22a00 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
22a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
22a20 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
22a30 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
22a40 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
22a50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22a60 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
22a70 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
22a80 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
22a90 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
22aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22ab0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
22ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22ad0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22ae0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
22af0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22b00 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22b10 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22b20 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22b30 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22b40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22b50 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22b60 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
22b70 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22b80 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
22b90 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
22ba0 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
22bb0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
22bc0 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
22bd0 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
22be0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
22bf0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22c00 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22c10 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22c20 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
22c30 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
22c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22c50 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
22c60 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
22c70 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a  empPathA(nMax, z
22c80 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
22c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22ca0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22cb0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22cc0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22cd0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
22ce0 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
22cf0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
22d00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22d10 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
22d20 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
22d50 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20  empname3", 0);. 
22d60 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d     }.    zUtf8 =
22d70 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
22d80 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
22d90 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
22da0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
22db0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22dc0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
22dd0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
22de0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
22df0 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
22e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22e10 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22e20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22e30 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22e40 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22e50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22e60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
22e70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
22e80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22e90 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a  WIN32_HAS_ANSI *
22ea0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  /.#endif /* !SQL
22eb0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
22ec0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
22ed0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
22ee0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
22ef0 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20  ctory ends with 
22f00 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  an appropriate. 
22f10 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20   ** separator.  
22f20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  If it does not a
22f30 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  nd there is not 
22f40 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66  enough space lef
22f50 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e  t to add.  ** on
22f60 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20  e, fail..  */.  
22f70 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49  if( !winMakeEndI
22f80 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20  nDirSep(nDir+1, 
22f90 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c  zBuf) ){.    sql
22fa0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22fb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
22fc0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22fd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
22fe0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
22ff0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
23000 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
23010 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29  etTempname4", 0)
23020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
23030 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
23040 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
23050 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
23060 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
23070 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 20  file .  ** name 
23080 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
23090 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20   format:.  **.  
230a0 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79  **   "<temporary
230b0 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c  _directory>/etil
230c0 71 73 5f 58 58 58 58 58 58 58 58 58 58 58 58 58  qs_XXXXXXXXXXXXX
230d0 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a  XX\0\0".  **.  *
230e0 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e  * If not, return
230f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20   SQLITE_ERROR.  
23100 54 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73  The number 17 is
23110 20 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72   used here in or
23120 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f  der to.  ** acco
23130 75 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61 63  unt for the spac
23140 65 20 75 73 65 64 20 62 79 20 74 68 65 20 31 35  e used by the 15
23150 20 63 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f   character rando
23160 6d 20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65  m suffix and the
23170 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69  .  ** two traili
23180 6e 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72  ng NUL character
23190 73 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69  s.  The final di
231a0 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
231b0 72 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a  r character.  **
231c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 64 64   has already add
231d0 65 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  ed if it was not
231e0 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
231f0 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20  ..  */.  nLen = 
23200 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
23210 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c  zBuf);.  if( (nL
23220 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20  en + nPre + 17) 
23230 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71  > nBuf ){.    sq
23240 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
23250 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
23260 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23270 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22  =SQLITE_ERROR\n"
23280 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
23290 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
232a0 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e  E_ERROR, 0, "win
232b0 47 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30  GetTempname5", 0
232c0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
232d0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d  3_snprintf(nBuf-
232e0 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c  16-nLen, zBuf+nL
232f0 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  en, SQLITE_TEMP_
23300 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20  FILE_PREFIX);.. 
23310 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
23320 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
23330 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
23340 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
23350 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
23360 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
23370 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
23380 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
23390 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
233a0 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
233b0 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
233c0 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66  f[j] = 0;.  zBuf
233d0 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a  [j+1] = 0;.  *pz
233e0 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f  Buf = zBuf;..  O
233f0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
23400 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20  LENAME name=%s, 
23410 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
23420 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72   zBuf));.  retur
23430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23440 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
23450 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
23460 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ile is really a 
23470 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75  directory.  Retu
23480 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69  rn false if.** i
23490 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t is something o
234a0 74 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65  ther than a dire
234b0 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65  ctory, or if the
234c0 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
234d0 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  f memory.** allo
234e0 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  cation failure..
234f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
23500 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69  nIsDir(const voi
23510 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a  d *zConverted){.
23520 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
23530 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
23540 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
23550 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
23560 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
23570 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
23580 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
23590 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
235a0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
235b0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
235c0 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
235d0 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
235e0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
235f0 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
23600 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
23630 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
23660 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
23670 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
23680 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
23690 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
236a0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49    return 0; /* I
236b0 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a  nvalid name? */.
236c0 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d      }.    attr =
236d0 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
236e0 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66  eAttributes;.#if
236f0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
23700 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
23710 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
23720 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
23730 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
23740 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
23750 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41  turn (attr!=INVA
23760 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
23770 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49  TES) && (attr&FI
23780 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
23790 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ECTORY);.}../*.*
237a0 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
237b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
237c0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
237d0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
237e0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74    /* Used to get
237f0 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61   maximum path na
23800 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63  me length */.  c
23810 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
23820 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
23830 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
23840 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
23850 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
23860 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
23870 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e   SQLite file han
23880 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
23890 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
238a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
238b0 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
238c0 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
238d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
238e0 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73  tus return flags
238f0 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20   */.){.  HANDLE 
23900 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  h;.  DWORD lastE
23910 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52  rrno = 0;.  DWOR
23920 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
23930 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
23940 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
23950 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
23960 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
23970 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
23980 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
23990 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
239a0 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
239b0 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
239c0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
239d0 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
239e0 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
239f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
23a00 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
23a10 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
23a20 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
23a30 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
23a40 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
23a50 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
23a60 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
23a70 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
23a80 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
23a90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
23aa0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
23ab0 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
23ac0 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
23ad0 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
23ae0 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
23af0 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
23b00 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b  r *zTmpname = 0;
23b10 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72   /* For temporar
23b20 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e  y filename, if n
23b30 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20  ecessary. */..  
23b40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23b50 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
23b60 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
23b70 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
23b80 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
23b90 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
23ba0 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
23bb0 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
23bc0 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
23bd0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
23be0 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
23bf0 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
23c00 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23c10 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
23c20 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
23c30 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23c40 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
23c50 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
23c60 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
23c70 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23c80 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69  CREATE);.  int i
23c90 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
23ca0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23cb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
23cc0 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
23cd0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
23ce0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23cf0 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  E);..#ifndef NDE
23d00 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e  BUG.  int isOpen
23d10 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65  Journal = (isCre
23d20 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
23d30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23d40 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
23d50 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
23d60 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
23d70 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
23d80 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
23d90 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
23da0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
23db0 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
23dc0 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c  %s, pFile=%p, fl
23dd0 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67  ags=%x, pOutFlag
23de0 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%p\n",.       
23df0 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69      zUtf8Name, i
23e00 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  d, flags, pOutFl
23e10 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ags));..  /* Che
23e20 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
23e30 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
23e40 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
23e50 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
23e60 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
23e70 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
23e80 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
23e90 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
23ea0 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
23eb0 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
23ec0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
23ed0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
23ee0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
23ef0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
23f00 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
23f10 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
23f20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
23f30 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
23f40 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
23f50 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
23f60 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
23f70 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
23f80 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
23f90 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
23fa0 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
23fb0 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
23fc0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
23fd0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
23fe0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
23ff0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
24000 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
24010 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
24020 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
24030 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
24040 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
24050 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
24060 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
24070 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
24080 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
24090 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
240a0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
240b0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
240c0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
240d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
240e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
240f0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
24100 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
24110 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24120 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
24130 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
24140 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
24150 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24160 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
24170 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
24180 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
24190 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
241a0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
241b0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
241c0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
241d0 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
241e0 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
241f0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
24200 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
24210 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
24220 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
24230 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
24240 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
24250 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
24260 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
24270 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24280 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
24290 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
242a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
242b0 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
242c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
242d0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
242e0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
242f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
24300 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
24310 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24320 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
24330 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
24340 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
24350 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c  0, sizeof(winFil
24360 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  e));.  pFile->h 
24370 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
24380 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c  _VALUE;..#if SQL
24390 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
243a0 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26  f( !zUtf8Name &&
243b0 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   !sqlite3_temp_d
243c0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
243d0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
243e0 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20  TE_ERROR,.      
243f0 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f    "sqlite3_temp_
24400 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62  directory variab
24410 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  le should be set
24420 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20   for WinRT");.  
24430 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
24440 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
24450 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
24460 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
24470 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a  generate a .  **
24480 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
24490 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a  name to use .  *
244a0 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
244b0 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
244c0 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  ( isDelete && !i
244d0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  sOpenJournal );.
244e0 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54      rc = winGetT
244f0 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a  empname(pVfs, &z
24500 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
24510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24520 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
24530 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24540 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61   rc=%s", zUtf8Na
24550 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
24560 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
24570 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24580 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
24590 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
245a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
245b0 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
245c0 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
245d0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
245e0 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
245f0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
24600 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
24610 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
24620 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
24630 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
24640 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
24650 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
24660 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
24670 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
24680 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
24690 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b        zUtf8Name[
246a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
246b0 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30  zUtf8Name)+1]==0
246c0 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72   );..  /* Conver
246d0 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
246e0 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
246f0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
24700 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
24710 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
24720 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
24730 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
24740 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
24750 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
24760 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
24770 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
24780 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
24790 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65  OMEM", zUtf8Name
247a0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
247b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
247c0 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69  M;.  }..  if( wi
247d0 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
247e0 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
247f0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24800 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
24810 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
24820 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
24830 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
24840 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
24850 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65  SDIR", zUtf8Name
24860 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
24870 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
24880 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SDIR;.  }..  if(
24890 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
248a0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
248b0 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
248c0 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
248d0 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
248e0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
248f0 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
24900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
24910 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
24920 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
24930 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
24940 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63   file is .  ** c
24950 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
24960 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
24970 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
24980 73 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20  sive access" .  
24990 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
249a0 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
249b0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
249c0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
249d0 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
249e0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
249f0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
24a00 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
24a10 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
24a20 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
24a30 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
24a40 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
24a50 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
24a60 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
24a70 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
24a80 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
24a90 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
24aa0 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
24ab0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
24ac0 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
24ad0 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
24ae0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
24af0 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
24b00 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
24b10 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
24b20 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
24b30 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
24b40 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
24b50 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
24b60 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
24b70 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
24b80 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
24b90 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
24ba0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
24bb0 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
24bc0 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
24bd0 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
24be0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
24bf0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
24c00 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
24c10 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
24c40 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
24c70 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
24c80 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
24c90 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
24ca0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
24cb0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
24cc0 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
24cd0 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
24ce0 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
24cf0 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
24d00 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
24d10 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
24d20 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
24d30 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
24d40 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
24d50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
24d60 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
24d70 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
24d80 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
24d90 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
24da0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
24db0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
24dc0 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
24dd0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
24de0 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
24df0 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
24e00 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24e10 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
24e20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
24e30 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
24e40 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
24e50 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
24e60 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
24e70 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
24e80 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
24e90 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
24ea0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
24eb0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
24ec0 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
24ed0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
24ee0 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
24ef0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
24f00 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
24f10 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
24f20 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
24f30 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
24f40 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
24f50 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
24f60 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
24f70 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
24f80 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
24f90 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
24fa0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28   osCreateFile2((
24fb0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
24fc0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
24ff0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
25040 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
25050 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25070 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
25080 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  ters))==INVALID_
25090 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
250c0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
250d0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
250e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
250f0 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
25100 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
25110 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
25120 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
25130 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
25160 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
25190 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
251c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
251f0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
25200 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
25230 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
25240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25260 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
25270 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
25280 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25290 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
252a0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
252b0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
252c0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
252d0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  {.    while( (h 
252e0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28  = osCreateFileA(
252f0 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74  (LPCSTR)zConvert
25300 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
25330 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
25360 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
25390 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
253c0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
253f0 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
25400 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
25430 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
25440 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
25450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
25460 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  op */.    }.  }.
25470 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49  #endif.  winLogI
25480 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53  oerr(cnt);..  OS
25490 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c  TRACE(("OPEN fil
254a0 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61  e=%p, name=%s, a
254b0 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73  ccess=%lx, rc=%s
254c0 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d  \n", h, zUtf8Nam
254d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77  e,.           dw
254e0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28  DesiredAccess, (
254f0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
25500 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
25510 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20  ed" : "ok"));.. 
25520 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
25530 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
25540 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
25550 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
25560 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
25570 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
25580 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  N, pFile->lastEr
25590 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20  rno, "winOpen", 
255a0 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20  zUtf8Name);.    
255b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
255c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
255d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
255e0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ame);.    if( is
255f0 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
25600 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
25610 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
25620 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
25630 64 2c 20 0a 20 20 20 20 20 20 20 20 20 28 28 66  d, .         ((f
25640 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  lags|SQLITE_OPEN
25650 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20  _READONLY) &.   
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    ~(SQLITE_OPEN_
25680 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
25690 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a  EN_READWRITE)),.
256a0 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61           pOutFla
256b0 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
256c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
256d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
256e0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
256f0 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
25700 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
25710 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  rite ){.      *p
25720 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
25730 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25740 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25750 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
25760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25770 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
25780 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
25790 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
257a0 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
257b0 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70  pOutFlags=%p, *p
257c0 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20  OutFlags=%d, ". 
257d0 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25 73            "rc=%s
257e0 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d  \n", h, zUtf8Nam
257f0 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
25800 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20 70  ss, pOutFlags, p
25810 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20 20  OutFlags ?.     
25820 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
25830 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49   : 0, (h==INVALI
25840 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
25850 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
25860 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  "));..#if SQLITE
25870 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
25880 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
25890 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
258a0 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
258b0 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43   && (rc = winceC
258c0 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
258d0 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45   pFile))!=SQLITE
258e0 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43  _OK.  ){.    osC
258f0 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
25900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25910 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
25920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
25930 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
25940 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c  RACE(("OPEN-CE-L
25950 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  OCK name=%s, rc=
25960 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71  %s\n", zName, sq
25970 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
25980 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ));.    return r
25990 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  c;.  }.  if( isT
259a0 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
259b0 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
259c0 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
259d0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
259e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
259f0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
25a00 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
25a10 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
25a20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
25a30 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
25a40 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
25a50 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  pVfs;.  pFile->h
25a60 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65   = h;.  if( isRe
25a70 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46  adonly ){.    pF
25a80 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
25a90 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  = WINFILE_RDONLY
25aa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
25ab0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
25ac0 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53  zName, "psow", S
25ad0 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
25ae0 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
25af0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
25b00 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53  gs |= WINFILE_PS
25b10 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  OW;.  }.  pFile-
25b20 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f  >lastErrno = NO_
25b30 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e  ERROR;.  pFile->
25b40 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
25b50 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
25b60 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c  AP_SIZE>0.  pFil
25b70 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
25b80 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
25b90 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ion = 0;.  pFile
25ba0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
25bb0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
25bc0 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70  eActual = 0;.  p
25bd0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
25be0 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
25bf0 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
25c00 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
25c10 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
25c20 45 41 44 53 3e 30 0a 20 20 73 71 6c 69 74 65 33  EADS>0.  sqlite3
25c30 54 68 72 65 61 64 43 72 65 61 74 65 28 26 70 46  ThreadCreate(&pF
25c40 69 6c 65 2d 3e 70 72 65 43 61 63 68 65 54 68 72  ile->preCacheThr
25c50 65 61 64 2c 20 77 69 6e 50 72 65 43 61 63 68 65  ead, winPreCache
25c60 54 68 72 65 61 64 2c 20 70 46 69 6c 65 29 3b 0a  Thread, pFile);.
25c70 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  .  {.    void *p
25c80 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Out = 0;.    sql
25c90 69 74 65 33 54 68 72 65 61 64 4a 6f 69 6e 28 70  ite3ThreadJoin(p
25ca0 46 69 6c 65 2d 3e 70 72 65 43 61 63 68 65 54 68  File->preCacheTh
25cb0 72 65 61 64 2c 20 26 70 4f 75 74 29 3b 0a 20 20  read, &pOut);.  
25cc0 20 20 70 46 69 6c 65 2d 3e 70 72 65 43 61 63 68    pFile->preCach
25cd0 65 54 68 72 65 61 64 20 3d 20 30 3b 0a 20 20 7d  eThread = 0;.  }
25ce0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
25cf0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
25d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25d10 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
25d20 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
25d30 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
25d40 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
25d50 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
25d60 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
25d70 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
25d80 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
25d90 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
25da0 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
25db0 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
25dc0 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
25dd0 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
25de0 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
25df0 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
25e00 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
25e10 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
25e20 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
25e30 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
25e40 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
25e50 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
25e60 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
25e70 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
25e80 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
25e90 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
25ea0 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
25eb0 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
25ec0 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
25ed0 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
25ee0 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
25ef0 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
25f00 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
25f10 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
25f20 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
25f30 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
25f40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
25f50 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
25f60 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
25f70 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
25f80 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
25f90 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
25fa0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
25fb0 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fd0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
25fe0 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
25ff0 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
26000 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
26010 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
26020 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
26030 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
26040 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
26050 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
26060 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
26070 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
26080 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
26090 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
260a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
260b0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
260c0 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
260d0 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
260e0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
260f0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
26100 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
26110 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
26120 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
26130 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
26140 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
26150 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26160 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
26170 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
26180 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26190 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
261a0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64  sIsNT() ){.    d
261b0 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
261c0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
261d0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
261e0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
261f0 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
26200 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
26210 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
26220 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
26230 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
26240 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
26250 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
26260 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
26290 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
262a0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
262b0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
262c0 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
262d0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
262e0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
262f0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
26300 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
26310 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
26320 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
26330 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
26340 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
26350 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26360 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
26370 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
26380 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
26390 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
263a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
263b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
263c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
263d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
263e0 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
263f0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
26400 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
26410 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
26420 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
26430 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
26440 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
26450 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
26460 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
26470 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
26480 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
26490 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
264a0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
264b0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
264c0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
264d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
264e0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
264f0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
26500 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
26510 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
26520 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
26530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26550 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
26560 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
26570 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
26580 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26590 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
265a0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
265b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
265c0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
265d0 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
265e0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
265f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26600 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
26610 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
26620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26630 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
26640 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26650 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26670 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
26680 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
26690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
266a0 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
266b0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
266c0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
266d0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
266e0 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
266f0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
26700 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
26710 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
26720 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
26730 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
26740 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
26750 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
26760 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
26770 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
26780 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
26790 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
267a0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
267b0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
267c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
267d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
267e0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
267f0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
26800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26810 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26820 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
26830 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
26840 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26850 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
26860 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
26870 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
26880 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26890 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
268a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
268b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
268c0 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
268d0 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
268e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
268f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
26900 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
26910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26920 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
26930 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
26940 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
26950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26960 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
26970 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
26980 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
26990 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
269a0 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
269b0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
269c0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
269d0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
269e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
269f0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26a00 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
26a10 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c  stErrno, "winDel
26a20 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
26a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
26a40 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
26a50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
26a60 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26a70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
26a80 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
26a90 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
26aa0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
26ab0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
26ac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
26ad0 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
26ae0 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
26af0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
26b00 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
26b10 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26b20 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
26b30 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
26b40 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
26b50 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
26b60 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
26b70 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
26b80 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
26b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26ba0 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
26bb0 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
26bc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
26bd0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
26be0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
26bf0 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
26c00 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
26c10 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
26c20 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
26c30 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
26c40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26c50 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
26c60 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
26c70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
26c80 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
26c90 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
26ca0 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
26cb0 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
26cc0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
26cd0 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
26ce0 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
26cf0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
26d00 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
26d10 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
26d20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
26d30 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
26d40 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
26d50 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
26d60 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
26d70 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
26d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26d90 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
26da0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
26db0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
26dc0 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
26dd0 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
26de0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
26df0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
26e00 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
26e10 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
26e20 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
26e30 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
26e40 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
26e50 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
26e80 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20  tandard, .      
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
26eb0 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
26ec0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
26ed0 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
26ee0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
26ef0 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
26f00 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
26f10 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
26f20 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
26f30 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
26f40 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
26f50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26f60 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
26f70 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
26f80 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
26f90 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
26fa0 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20  zeHigh==0 .     
26fb0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
26fc0 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
26fd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
26fe0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
26ff0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
27000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27010 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
27020 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
27030 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
27040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69   }else{.      wi
27050 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
27060 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
27070 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
27080 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
27090 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
270a0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
270b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
270c0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
270d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
270e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
270f0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
27100 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
27110 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20  nAccess",.      
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
27140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27150 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
27160 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
27170 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
27180 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
27190 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
271a0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
271b0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
271c0 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
271d0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
271e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
271f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
27200 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
27210 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
27220 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
27230 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
27240 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
27250 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
27260 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
27270 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
27280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27290 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
272a0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
272b0 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
272c0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
272d0 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
272e0 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
272f0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
27300 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
27310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
27320 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
27330 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
27340 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
27350 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
27360 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28  = rc;.  OSTRACE(
27370 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
27380 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70  , pResOut=%p, *p
27390 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51  ResOut=%d, rc=SQ
273a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
273b0 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
273c0 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
273d0 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
273e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
273f0 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
27400 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
27410 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
27420 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
27430 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f  ive letter.** fo
27440 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f  llowed by a colo
27450 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  n character..*/.
27460 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
27470 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
27480 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  olon(.  const ch
27490 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
274a0 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69  .  return ( sqli
274b0 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68  te3Isalpha(zPath
274c0 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74  name[0]) && zPat
274d0 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b  hname[1]==':' );
274e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
274f0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
27500 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
27510 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
27520 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
27530 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
27540 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
27550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
27560 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
27570 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
27580 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
27590 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
275a0 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
275b0 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
275c0 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
275d0 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
275e0 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
275f0 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
27600 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
27610 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
27620 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
27630 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
27640 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
27650 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
27660 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
27670 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
27680 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
27690 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
276a0 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
276b0 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
276c0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
276d0 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
276e0 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
276f0 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
27700 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
27710 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
27720 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
27730 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
27740 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
27750 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
27760 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
27770 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
27780 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
27790 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
277a0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
277b0 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
277c0 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
277d0 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
277e0 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d  sDirSep(zPathnam
277f0 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[0]) ){.    ret
27800 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
27810 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
27820 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
27830 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61   with a letter a
27840 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73  nd a colon it is
27850 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65   either a volume
27860 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70  .  ** relative p
27870 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  ath or an absolu
27880 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72  te path.  Caller
27890 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
278a0 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a  on must not.  **
278b0 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61   attempt to trea
278c0 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69  t it as a relati
278d0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e  ve path name (i.
278e0 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73  e. they should s
278f0 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69  imply use.  ** i
27900 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a  t verbatim)..  *
27910 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72  /.  if ( winIsDr
27920 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
27930 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a  n(zPathname) ){.
27940 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
27950 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27960 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69  If we get to thi
27970 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74  s point, the pat
27980 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c  h name should al
27990 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62  most certainly b
279a0 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20  e a purely.  ** 
279b0 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e  relative one (i.
279c0 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d  e. not a UNC nam
279d0 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c  e, not absolute,
279e0 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20   and not volume 
279f0 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a  relative)..  */.
27a00 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
27a10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
27a20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
27a30 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
27a40 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
27a50 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
27a60 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
27a70 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
27a80 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
27a90 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
27aa0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
27ab0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
27ac0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
27ad0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27af0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
27b00 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
27b10 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
27b20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
27b30 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
27b40 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
27b50 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
27b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
27b70 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
27b80 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
27b90 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
27bc0 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65   */.){.  .#if de
27bd0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
27be0 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
27bf0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27c00 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
27c10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
27c20 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Full);.  assert(
27c30 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
27c40 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
27c50 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
27c60 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
27c70 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
27c80 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
27c90 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
27ca0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
27cb0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
27cc0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
27cd0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
27ce0 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
27cf0 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
27d00 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
27d10 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
27d20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
27d30 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
27d40 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27d50 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
27d60 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
27d70 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
27d80 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
27d90 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
27da0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
27db0 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
27dc0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
27dd0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
27de0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
27df0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27e00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27e10 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
27e20 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
27e30 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
27e40 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
27e50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
27e60 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
27e70 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20  IN_A) |.        
27e80 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45      CCP_RELATIVE
27e90 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  , zRelative, zOu
27ea0 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t, pVfs->mxPathn
27eb0 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  ame+1)<0 ){.    
27ec0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27ed0 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
27ee0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
27ef0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
27f00 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
27f10 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
27f40 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
27f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27f60 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
27f70 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
27f80 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20  ilename(zOut);. 
27f90 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
27fa0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27fb0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
27fc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
27fd0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27ff0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
28000 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
28010 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
28020 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
28050 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
28060 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
28070 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
28080 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
28090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
280a0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
280b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
280c0 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
280d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
280e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
280f0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
28100 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
28110 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28120 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
28130 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
28140 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
28150 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
28160 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
28170 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
28180 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20  _WIN_A),.       
28190 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20       zRelative, 
281a0 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61  zOut, pVfs->mxPa
281b0 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20  thname+1)<0 ){. 
281c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
281d0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
281e0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
281f0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
28200 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  N_CONVPATH, (DWO
28210 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
28240 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
28250 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28260 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
28270 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
28280 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29  f8Filename(zOut)
28290 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74  ;.      if( !zUt
282a0 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  f8 ){.        sq
282b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
282c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
282d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
282e0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
282f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
28300 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
28310 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
28320 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
28330 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
28340 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
28350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28360 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
28370 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
28380 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
28390 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53  ..#if (SQLITE_OS
283a0 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
283b0 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64  _OS_WINRT) && !d
283c0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
283d0 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
283e0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
283f0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f  ITE_ERROR );.  /
28400 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
28410 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
28420 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
28430 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
28440 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61  */.  /* WinRT ha
28450 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76  s no way to conv
28460 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70  ert a relative p
28470 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ath to an absolu
28480 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20  te one. */.  if 
28490 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
284a0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
284b0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
284c0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
284d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
284e0 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
284f0 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
28500 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
28510 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
28520 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
28530 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
28540 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
28550 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
28560 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
28570 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
28580 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
28590 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
285a0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
285b0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
285c0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
285d0 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
285e0 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
285f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
28600 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
28610 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
28620 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
28650 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
28660 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
28670 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65  lative);.  }else
28680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
28690 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
286a0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
286b0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
286c0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
286d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
286e0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
286f0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
28700 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
28710 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
28720 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
28730 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20   DWORD nByte;.  
28740 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
28750 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
28760 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
28770 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
28780 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
28790 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
287a0 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
287b0 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
287c0 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
287d0 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
287e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
287f0 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
28800 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  & winIsDriveLett
28810 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61  erAndColon(zRela
28820 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a  tive+1) ){.    z
28830 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
28840 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
28850 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
28860 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
28870 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
28880 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
28890 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
288a0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
288b0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
288c0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
288d0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
288e0 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
288f0 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
28900 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
28910 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
28920 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
28930 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
28940 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
28950 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
28960 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
28970 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
28980 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
28990 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
289a0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
289b0 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
289c0 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
289d0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
289e0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
289f0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
28a00 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
28a10 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
28a20 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
28a30 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
28a40 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
28a50 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
28a60 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
28a70 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
28a80 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
28a90 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
28aa0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
28ab0 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
28ac0 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
28ad0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
28ae0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
28af0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
28b00 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
28b10 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
28b30 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
28b40 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
28b50 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  p(), zRelative);
28b60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28b70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f  TE_OK;.  }.  zCo
28b80 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
28b90 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
28ba0 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
28bb0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
28bc0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
28bd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28be0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
28bf0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
28c00 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20   LPWSTR zTemp;. 
28c10 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
28c20 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
28c30 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
28c40 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
28c50 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
28c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28c70 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28c80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
28c90 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
28ca0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
28cb0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
28cc0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28ce0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
28cf0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
28d00 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b     }.    nByte +
28d10 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  = 3;.    zTemp =
28d20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
28d30 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
28d40 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
28d50 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
28d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28d70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28d80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
28d90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28da0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  M;.    }.    nBy
28db0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
28dc0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
28dd0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
28de0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
28df0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
28e00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28e10 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28e30 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28e40 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
28e50 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
28e60 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
28e70 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
28e80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
28e90 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
28ea0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20  FullPathname2", 
28eb0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
28ec0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
28ed0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28ee0 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
28ef0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
28f00 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
28f10 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
28f20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
28f30 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
28f40 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
28f50 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
28f60 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
28f70 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
28f80 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
28f90 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
28fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28fb0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28fc0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
28fd0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28fe0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
28ff0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
29000 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
29030 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69  hname3", zRelati
29040 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
29050 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
29060 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
29070 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
29080 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
29090 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
290a0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
290b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
290c0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
290d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
290e0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
290f0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
29100 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
29110 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
29120 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
29130 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
29140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
29150 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29160 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
29170 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
29180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
29190 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
291a0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
291b0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
291c0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
291f0 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  4", zRelative);.
29200 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29210 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29220 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73  d);.    zOut = s
29230 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
29240 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
29250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
29260 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
29270 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74  endif.  if( zOut
29280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29290 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
292a0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
292b0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
292c0 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
292d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
292e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
292f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
29300 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29310 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
29320 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
29330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29340 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
29350 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
29360 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
29370 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
29380 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
29390 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
293a0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
293b0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
293c0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
293d0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
293e0 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71  id *winDlOpen(sq
293f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
29410 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c  lename){.  HANDL
29420 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  E h;.#if defined
29430 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69  (__CYGWIN__).  i
29440 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d  nt nFull = pVfs-
29450 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
29460 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73   char *zFull = s
29470 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
29480 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69  ( nFull );.  voi
29490 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
294a0 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d  0;.  if( zFull==
294b0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
294c0 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
294d0 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
294e0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
294f0 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75  d*)0));.    retu
29500 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
29510 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
29520 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
29530 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d   nFull, zFull)!=
29540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29550 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
29560 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ull);.    OSTRAC
29570 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
29580 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
29590 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
295a0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
295b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f  urn 0;.  }.  zCo
295c0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
295d0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
295e0 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73  name(zFull);.  s
295f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
29600 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64  l);.#else.  void
29610 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77   *zConverted = w
29620 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
29630 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
29640 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
29650 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
29660 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f  #endif.  if( zCo
29670 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
29680 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
29690 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
296a0 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
296b0 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
296c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
296d0 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
296e0 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
296f0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d  OS_WINRT.    h =
29700 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
29710 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29  ibrary((LPCWSTR)
29720 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a  zConverted, 0);.
29730 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73  #else.    h = os
29740 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50  LoadLibraryW((LP
29750 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
29760 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
29770 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
29780 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
29790 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  e{.    h = osLoa
297a0 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a  dLibraryA((char*
297b0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
297c0 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
297d0 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
297e0 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
297f0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
29800 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69  oid*)h));.  sqli
29810 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29820 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
29830 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
29840 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
29850 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
29860 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
29870 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
29880 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29890 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65  R(pVfs);.  winGe
298a0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
298b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
298c0 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
298d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
298e0 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
298f0 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20  _vfs *pVfs,void 
29900 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  *pH,const char *
29910 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
29920 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20  FARPROC proc;.  
29930 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29940 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d  (pVfs);.  proc =
29950 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73   osGetProcAddres
29960 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a  sA((HANDLE)pH, z
29970 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Sym);.  OSTRACE(
29980 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25  ("DLSYM handle=%
29990 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64  p, symbol=%s, ad
299a0 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  dress=%p\n",.   
299b0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
299c0 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29  H, zSym, (void*)
299d0 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  proc));.  return
299e0 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
299f0 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  proc;.}.static v
29a00 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
29a10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29a20 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
29a30 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
29a40 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
29a50 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
29a60 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20  DLE)pHandle);.  
29a70 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53  OSTRACE(("DLCLOS
29a80 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  E handle=%p\n", 
29a90 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29  (void*)pHandle))
29aa0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
29ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
29ac0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
29ad0 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
29ae0 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
29af0 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
29b00 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
29b10 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
29b20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
29b30 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
29b40 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
29b50 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
29b60 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
29b70 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
29b80 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
29b90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29ba0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
29bb0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
29bc0 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
29bd0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29be0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
29bf0 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d  LITE_TEST).  n =
29c00 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28   nBuf;.  memset(
29c10 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
29c20 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
29c30 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
29c40 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
29c50 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
29c60 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
29c70 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &x);.    memcpy(
29c80 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69  &zBuf[n], &x, si
29c90 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20  zeof(x));.    n 
29ca0 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20  += sizeof(x);.  
29cb0 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
29cc0 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
29cd0 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
29ce0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
29cf0 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
29d00 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29d10 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
29d20 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
29d30 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66  of(pid);.  }.#if
29d40 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
29d50 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c  .  if( sizeof(UL
29d60 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e  ONGLONG)<=nBuf-n
29d70 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e   ){.    ULONGLON
29d80 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
29d90 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
29da0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
29db0 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
29dc0 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
29dd0 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
29de0 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
29df0 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
29e00 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e   ){.    DWORD cn
29e10 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
29e20 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
29e30 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
29e40 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
29e50 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
29e60 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
29e70 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
29e80 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
29e90 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
29ea0 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
29eb0 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
29ec0 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20  ceCounter(&i);. 
29ed0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
29ee0 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69  n], &i, sizeof(i
29ef0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29f00 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64  eof(i);.  }.#end
29f10 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  if.  return n;.}
29f20 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
29f30 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
29f40 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
29f50 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
29f60 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
29f70 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69  nt winSleep(sqli
29f80 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
29f90 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20  nt microsec){.  
29fa0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
29fb0 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  eep((microsec+99
29fc0 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53  9)/1000);.  UNUS
29fd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29fe0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d  s);.  return ((m
29ff0 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
2a000 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  0)*1000;.}../*.*
2a010 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2a020 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
2a030 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
2a040 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
2a050 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
2a060 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
2a070 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
2a080 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
2a090 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2a0a0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
2a0b0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
2a0c0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
2a0d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
2a0e0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2a0f0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
2a100 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
2a110 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
2a120 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
2a130 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2a140 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2a150 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2a160 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2a170 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
2a180 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
2a190 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2a1a0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2a1b0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
2a1c0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
2a1d0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
2a1e0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
2a1f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
2a200 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
2a210 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
2a220 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
2a230 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
2a240 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
2a250 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2a260 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
2a270 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
2a280 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
2a290 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
2a2a0 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
2a2b0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
2a2c0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2a2d0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
2a2e0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2a2f0 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
2a300 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
2a310 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
2a320 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
2a330 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
2a340 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
2a350 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
2a360 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
2a370 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30  ber of .     100
2a380 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
2a390 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
2a3a0 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
2a3b0 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20  D 2305813.5). . 
2a3c0 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
2a3d0 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
2a3e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2a3f0 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
2a400 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
2a410 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
2a420 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
2a430 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
2a440 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2a450 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
2a460 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
2a470 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
2a480 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
2a490 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
2a4a0 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
2a4b0 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
2a4c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2a4d0 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
2a4e0 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20  BitValue = .    
2a4f0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
2a500 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
2a510 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
2a520 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20  0000000 +.      
2a530 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2a540 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53  94967296;..#if S
2a550 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
2a560 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
2a570 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ;.  osGetSystemT
2a580 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
2a590 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
2a5a0 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
2a5b0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
2a5c0 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53  o. */.  if (!osS
2a5d0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2a5e0 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b  ime(&time,&ft)){
2a5f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a600 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
2a610 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
2a620 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
2a630 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a   &ft );.#endif..
2a640 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69    *piNow = winFi
2a650 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20  letimeEpoch +.  
2a660 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71            ((((sq
2a670 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2a680 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d  wHighDateTime)*m
2a690 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20  ax32BitValue) + 
2a6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
2a6c0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
2a6d0 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
2a6e0 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
2a6f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2a700 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2a710 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
2a720 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
2a730 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
2a740 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
2a750 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
2a760 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
2a770 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a790 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
2a7a0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2a7b0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2a7c0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2a7d0 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2a7e0 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2a7f0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2a800 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2a810 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2a820 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2a830 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2a840 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2a850 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2a860 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2a870 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2a880 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
2a890 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
2a8a0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2a8b0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
2a8c0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2a8d0 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
2a8e0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2a8f0 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2a900 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
2a910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a920 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2a930 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2a940 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
2a950 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
2a960 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
2a970 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
2a980 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
2a990 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
2a9a0 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
2a9b0 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
2a9c0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a9d0 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
2a9e0 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
2a9f0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
2aa00 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
2aa10 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
2aa20 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
2aa30 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
2aa40 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
2aa50 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
2aa60 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
2aa70 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
2aa80 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
2aa90 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
2aaa0 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
2aab0 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
2aac0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
2aad0 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2aae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2aaf0 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2ab00 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2ab10 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2ab20 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2ab30 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2ab40 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2ab50 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2ab60 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2ab70 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2ab80 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2ab90 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2aba0 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2abb0 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2abc0 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2abd0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2abe0 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2abf0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2ac00 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2ac10 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2ac20 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2ac30 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2ac40 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2ac50 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2ac60 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2ac70 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2ac80 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2ac90 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2aca0 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2acb0 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2acc0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2acd0 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2ace0 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2acf0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2ad00 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2ad10 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2ad20 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2ad30 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2ad40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2ad50 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2ad60 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2ad70 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2ad80 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2ad90 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2ada0 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2adb0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2adc0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2add0 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2ade0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2adf0 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2ae00 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2ae10 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2ae20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2ae30 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2ae40 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2ae50 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2ae60 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
2ae70 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2ae80 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61   return winGetLa
2ae90 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
2aea0 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
2aeb0 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
2aec0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
2aed0 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
2aee0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2aef0 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
2af00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
2af10 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
2af20 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2af30 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
2af40 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2af50 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2af60 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2af70 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
2af80 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2af90 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2afa0 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2afb0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2afc0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2afd0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2afe0 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b000 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2b030 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2b040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2b050 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2b060 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2b070 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2b080 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2b090 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
2b0a0 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
2b0b0 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
2b0c0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2b0d0 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2b0f0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2b100 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2b110 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2b120 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2b130 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
2b140 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
2b150 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
2b160 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2b170 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2b180 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2b190 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2b1a0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2b1b0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2b1c0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b1d0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2b1e0 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
2b1f0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
2b200 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
2b210 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
2b220 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
2b230 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2b240 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2b250 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2b260 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2b270 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2b280 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2b290 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
2b2a0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
2b2b0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
2b2c0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2b2d0 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66   */.  };.#if def
2b2e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2b2f0 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74  2_HAS_WIDE).  st
2b300 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2b310 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20   winLongPathVfs 
2b320 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2b330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b340 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2b350 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2b360 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2b370 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2b380 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59  INNT_MAX_PATH_BY
2b390 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2b3a0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3c0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2b3d0 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c  win32-longpath",
2b3e0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2b3f0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b400 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2b410 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2b420 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2b430 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2b440 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2b450 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2b460 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2b470 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2b480 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2b490 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2b4a0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2b4b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2b4c0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2b4d0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2b4e0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2b4f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2b500 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2b510 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2b520 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2b530 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2b540 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2b550 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2b560 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2b570 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2b580 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2b590 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2b5a0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2b5b0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2b5c0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2b5d0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2b5e0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2b5f0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2b600 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b610 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2b620 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2b630 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2b640 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2b650 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b660 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2b670 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2b680 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2b690 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2b6a0 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2b6b0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2b6c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75  #endif..  /* Dou
2b6d0 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
2b6e0 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
2b6f0 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
2b700 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
2b710 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
2b720 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
2b730 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
2b740 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2b750 61 53 79 73 63 61 6c 6c 29 3d 3d 37 37 20 29 3b  aSyscall)==77 );
2b760 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72  ..  /* get memor
2b770 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e  y map allocation
2b780 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a   granularity */.
2b790 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73    memset(&winSys
2b7a0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
2b7b0 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23  SYSTEM_INFO));.#
2b7c0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2b7d0 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65  RT.  osGetNative
2b7e0 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2b7f0 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  ysInfo);.#else. 
2b800 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
2b810 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
2b820 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
2b830 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
2b840 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
2b850 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ty>0 );.  assert
2b860 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  ( winSysInfo.dwP
2b870 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20  ageSize>0 );..  
2b880 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
2b890 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
2b8a0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
2b8b0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b8c0 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f  WIDE).  sqlite3_
2b8d0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
2b8e0 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29  nLongPathVfs, 0)
2b8f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
2b900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
2b910 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
2b920 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
2b930 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2b940 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21  .  if( sleepObj!
2b950 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43  =NULL ){.    osC
2b960 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
2b970 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f  Obj);.    sleepO
2b980 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23  bj = NULL;.  }.#
2b990 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
2b9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
2b9b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2b9c0 5f 57 49 4e 20 2a 2f 0a                          _WIN */.