/ Hex Artifact Content
Login

Artifact 1662c40d22be162698a31725e836eede09e841ed:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64  or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57  ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73  AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68   several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61  at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64  vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61  ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51  rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26  LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72  _OMIT_WAL).#  er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65  ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66  quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69  NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45  le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64  _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
06c0: 74 68 65 20 72 65 71 75 69 72 65 64 20 57 69 6e  the required Win
06d0: 64 6f 77 73 20 53 44 4b 20 76 65 72 73 69 6f 6e  dows SDK version
06e0: 20 63 6f 6e 73 74 61 6e 74 73 20 69 66 20 74 68   constants if th
06f0: 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c  ey are not.** al
0700: 72 65 61 64 79 20 61 76 61 69 6c 61 62 6c 65 2e  ready available.
0710: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 54 44 44  .*/.#ifndef NTDD
0720: 49 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65  I_WIN8.#  define
0730: 20 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20   NTDDI_WIN8     
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65     0x06020000.#e
0760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54  ndif..#ifndef NT
0770: 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 64  DDI_WINBLUE.#  d
0780: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 42  efine NTDDI_WINB
0790: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
07a0: 20 20 20 20 20 20 20 20 30 78 30 36 30 33 30 30          0x060300
07b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  00.#endif../*.**
07c0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 47 65   Check if the Ge
07d0: 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66  tVersionEx[AW] f
07e0: 75 6e 63 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  unctions should 
07f0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64 65  be considered de
0800: 70 72 65 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20  precated.** and 
0810: 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 6d  avoid using them
0820: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
0830: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74  It should be not
0840: 65 64 20 68 65 72 65 20 74 68 61 74 20 69 66 20  ed here that if 
0850: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
0860: 74 68 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  the SQLITE_WIN32
0870: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 70 72  _GETVERSIONEX pr
0880: 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
0890: 6f 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 77 68  o is zero.** (wh
08a0: 65 74 68 65 72 20 76 69 61 20 74 68 69 73 20 62  ether via this b
08b0: 6c 6f 63 6b 20 6f 72 20 76 69 61 20 62 65 69 6e  lock or via bein
08c0: 67 20 6d 61 6e 75 61 6c 6c 79 20 73 70 65 63 69  g manually speci
08d0: 66 69 65 64 29 2c 20 74 68 61 74 20 69 6d 70 6c  fied), that impl
08e0: 69 65 73 0a 2a 2a 20 74 68 65 20 75 6e 64 65 72  ies.** the under
08f0: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
0900: 73 79 73 74 65 6d 20 77 69 6c 6c 20 61 6c 77 61  system will alwa
0910: 79 73 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ys be based on t
0920: 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a  he Windows NT.**
0930: 20 4b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e   Kernel..*/.#ifn
0940: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
0950: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
0960: 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44   if defined(NTDD
0970: 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54  I_VERSION) && NT
0980: 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e  DDI_VERSION >= N
0990: 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20  TDDI_WINBLUE.#  
09a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
09b0: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
09c0: 45 58 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  EX   0.#  else.#
09d0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
09e0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
09f0: 4f 4e 45 58 20 20 20 31 0a 23 20 20 65 6e 64 69  ONEX   1.#  endi
0a00: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0a10: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0a20: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0a30: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0a40: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0a50: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
0a60: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
0a70: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
0aa0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
0ab0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0ac0: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0ad0: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0ae0: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0af0: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0b00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0b10: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0b20: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0b30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0b40: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0b50: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0b60: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0b70: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0b80: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0b90: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ba0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0bb0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0bc0: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0bd0: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0be0: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0bf0: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0c00: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0c10: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0c20: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0c30: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0c40: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0c50: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0c60: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0c80: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0c90: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0cb0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0cc0: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0cd0: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0ce0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0cf0: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0d00: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0d10: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0d20: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0d30: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0d40: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0d50: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0d60: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0d70: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0d80: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0d90: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0da0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0db0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0dc0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0dd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0de0: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0df0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0e00: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0e10: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0e20: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0e30: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0e40: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0e50: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0e60: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0e70: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0e80: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0ea0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0eb0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0ec0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0ed0: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_BYTES   \.   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
0f00: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0f10: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0f20: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0f30: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0f40: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0f50: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0f60: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0f70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0f80: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0f90: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0fa0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0fb0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0fd0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0fe0: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0ff0: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
1000: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
1010: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
1020: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
1030: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1040: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1060: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
1070: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1090: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
10a0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
10b0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
10c0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
10d0: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
10e0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
10f0: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1100: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1110: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1120: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1130: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1140: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1150: 45 5f 56 41 4c 55 45 28 78 29 20 28 76 6f 69 64  E_VALUE(x) (void
1160: 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )(x).#endif../*.
1170: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
1180: 68 61 72 61 63 74 65 72 20 74 68 61 74 20 73 68  haracter that sh
1190: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
11a0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
11b0: 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  parator..*/.#ifn
11c0: 64 65 66 20 77 69 6e 47 65 74 44 69 72 53 65 70  def winGetDirSep
11d0: 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65  .#  define winGe
11e0: 74 44 69 72 53 65 70 28 29 20 20 20 20 20 20 20  tDirSep()       
11f0: 20 20 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65           '\\'.#e
1200: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77  ndif../*.** Do w
1210: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c  e need to manual
1220: 6c 79 20 64 65 66 69 6e 65 20 74 68 65 20 57 69  ly define the Wi
1230: 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  n32 file mapping
1240: 20 41 50 49 73 20 66 6f 72 20 75 73 65 20 77 69   APIs for use wi
1250: 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28  th WAL.** mode (
1260: 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73 20  e.g. these APIs 
1270: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  are available in
1280: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 43 45 20   the Windows CE 
1290: 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74 68  SDK; however, th
12a0: 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 70 72  ey.** are not pr
12b0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65 61  esent in the hea
12c0: 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69  der file)?.*/.#i
12d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  f SQLITE_WIN32_F
12e0: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
12f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1300: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a  E_OMIT_WAL)./*.*
1310: 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 66 69 6c  * Two of the fil
1320: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 61  e mapping APIs a
1330: 72 65 20 64 69 66 66 65 72 65 6e 74 20 75 6e 64  re different und
1340: 65 72 20 57 69 6e 52 54 2e 20 20 46 69 67 75 72  er WinRT.  Figur
1350: 65 20 6f 75 74 20 77 68 69 63 68 0a 2a 2a 20 73  e out which.** s
1360: 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23  et we need..*/.#
1370: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1380: 52 54 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41  RT.WINBASEAPI HA
1390: 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61  NDLE WINAPI Crea
13a0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
13b0: 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  mApp(HANDLE, \. 
13c0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
13d0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 55 4c  Y_ATTRIBUTES, UL
13e0: 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 4c 50  ONG, ULONG64, LP
13f0: 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 41 53 45  CWSTR);..WINBASE
1400: 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50  API LPVOID WINAP
1410: 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  I MapViewOfFileF
1420: 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 55  romApp(HANDLE, U
1430: 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 53  LONG, ULONG64, S
1440: 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23 69  IZE_T);.#else.#i
1450: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1470: 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44  .WINBASEAPI HAND
1480: 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65  LE WINAPI Create
1490: 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 48 41 4e  FileMappingA(HAN
14a0: 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f  DLE, LPSECURITY_
14b0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
14c0: 20 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f        DWORD, DWO
14d0: 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 53 54  RD, DWORD, LPCST
14e0: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
14f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1500: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 2a 2f 0a  32_HAS_ANSI) */.
1510: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1520: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1530: 44 45 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  DE).WINBASEAPI H
1540: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
1550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1560: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
1570: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
1580: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
1590: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
15a0: 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f  CWSTR);.#endif /
15b0: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
15c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
15d0: 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 50 49 20   */..WINBASEAPI 
15e0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
15f0: 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e 44  pViewOfFile(HAND
1600: 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  LE, DWORD, DWORD
1610: 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54 29  , DWORD, SIZE_T)
1620: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1630: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
1640: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
1650: 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20 63  mapping API is c
1660: 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69  ommon to both Wi
1670: 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a  n32 and WinRT..*
1680: 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f  /.WINBASEAPI BOO
1690: 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56 69  L WINAPI UnmapVi
16a0: 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44  ewOfFile(LPCVOID
16b0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16c0: 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41  ITE_WIN32_FILEMA
16d0: 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65  PPING_API && !de
16e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16f0: 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_WAL) */../*.**
1700: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
1710: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
1720: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
1730: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
1740: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1750: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
1760: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1770: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
1780: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1790: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
17a0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
17b0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
17c0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
17d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17e0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
17f0: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
1800: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
1810: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
1820: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1840: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1850: 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63 74 75  ences to structu
1860: 72 65 73 20 75 73 65 64 20 66 6f 72 20 57 41 4c  res used for WAL
1870: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1880: 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d  ct winShm winShm
1890: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
18b0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
18c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
18d0: 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d  inShmNode winShm
18e0: 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67  Node;   /* A reg
18f0: 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ion of shared-me
1900: 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  mory */.#endif..
1910: 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b  /*.** WinCE lack
1920: 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74  s native support
1930: 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   for file lockin
1940: 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  g so we have to 
1950: 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  fake it.** with 
1960: 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72  some code of our
1970: 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   own..*/.#if SQL
1980: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70  ITE_OS_WINCE.typ
1990: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
19a0: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
19b0: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
19c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
19d0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
19e0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
19f0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
1a00: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
1a10: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1a20: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1a30: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
1a40: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1a50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
1a60: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
1a70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
1a80: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
1a90: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
1aa0: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
1ab0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
1ac0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
1ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
1ae0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1af0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
1b00: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
1b10: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
1b20: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
1b30: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
1b40: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
1b50: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
1b60: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
1b70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b80: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
1b90: 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66  ; /*** Must be f
1ba0: 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69  irst ***/.  sqli
1bb0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1bc0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75      /* The VFS u
1bd0: 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73  sed to open this
1be0: 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c   file */.  HANDL
1bf0: 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  E h;            
1c00: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
1c10: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 66   accessing the f
1c20: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b  ile */.  u8 lock
1c30: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
1c40: 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
1c50: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1c60: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1c70: 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f    short sharedLo
1c80: 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e  ckByte;   /* Ran
1c90: 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74  domly chosen byt
1ca0: 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61 72  e used as a shar
1cb0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  ed lock */.  u8 
1cc0: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1cd0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20       /* Flags.  
1ce0: 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65  See WINFILE_* be
1cf0: 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  low */.  DWORD l
1d00: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1d10: 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1d20: 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1d30: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1d40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d50: 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68  OMIT_WAL.  winSh
1d60: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1d70: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
1d80: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
1d90: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1da0: 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63  #endif.  const c
1db0: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1dc0: 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d   /* Full pathnam
1dd0: 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a  e of this file *
1de0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e00: 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67  hunk size config
1e10: 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48  ured by FCNTL_CH
1e20: 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20  UNK_SIZE */.#if 
1e30: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1e40: 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65    LPWSTR zDelete
1e50: 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d  OnClose;  /* Nam
1e60: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
1e70: 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  ete when closing
1e80: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75   */.  HANDLE hMu
1e90: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tex;          /*
1ea0: 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20 63   Mutex used to c
1eb0: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
1ec0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20   shared lock */ 
1ed0: 20 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72   .  HANDLE hShar
1ee0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ed;         /* S
1ef0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
1f00: 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f  ment used for lo
1f10: 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  cking */.  wince
1f20: 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20  Lock local;     
1f30: 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61     /* Locks obta
1f40: 69 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e 73  ined by this ins
1f50: 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65  tance of winFile
1f60: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f70: 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a  *shared;      /*
1f80: 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c   Global shared l
1f90: 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ock memory for t
1fa0: 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64  he file  */.#end
1fb0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
1fc0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1fd0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
2000: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
2010: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41  ferences */.  HA
2020: 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2040: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
2050: 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  ing memory mappi
2060: 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ng */.  void *pM
2070: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
2080: 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65        /* Area me
2090: 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
20a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
20b0: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  mapSize;       /
20c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
20d0: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
20e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
20f0: 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  4 mmapSizeActual
2100: 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65  ; /* Actual size
2110: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
2120: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
2130: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
2140: 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
2150: 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  ed FCNTL_MMAP_SI
2160: 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  ZE value */.#end
2170: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
2180: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2190: 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  winFile.ctrlFlag
21a0: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  s.*/.#define WIN
21b0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
21c0: 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43       0x02   /* C
21d0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
21e0: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
21f0: 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  e WINFILE_PERSIS
2200: 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20 20  T_WAL     0x04  
2210: 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57   /* Persistent W
2220: 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69  AL mode */.#defi
2230: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20  ne WINFILE_PSOW 
2240: 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30 20             0x10 
2250: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
2260: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
2270: 57 52 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65  WRITE */.#define
2280: 20 57 49 4e 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20   WINFILE_NOLOCK 
2290: 20 20 20 20 20 20 20 20 20 30 78 32 30 20 20 20           0x20   
22a0: 2f 2a 20 4e 65 76 65 72 20 64 6f 20 61 6e 79 20  /* Never do any 
22b0: 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  real locking */.
22c0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20  ./*. * The size 
22d0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75 73  of the buffer us
22e0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69  ed by sqlite3_wi
22f0: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
2300: 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ).. */.#ifndef S
2310: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
2320: 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  BUF_SIZE.#  defi
2330: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2340: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28  DBG_BUF_SIZE   (
2350: 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f  (int)(4096-sizeo
2360: 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69  f(DWORD))).#endi
2370: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2380: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2390: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
23a0: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
23b0: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
23c0: 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
23d0: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
23e0: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
23f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
2400: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
2410: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2420: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
2430: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a  ECTORY_TYPE (1).
2440: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2450: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
2460: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
2470: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
2480: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
2490: 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79   * the temporary
24a0: 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c   directory shoul
24b0: 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a  d be changed.. *
24c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
24d0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
24e0: 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65  CTORY_TYPE.#  de
24f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2500: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
2510: 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66  _TYPE (2).#endif
2520: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69  ../*. * If compi
2530: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
2540: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20  WIN32_MALLOC on 
2550: 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c  Windows, we will
2560: 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69   use the. * vari
2570: 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68 65  ous Win32 API he
2580: 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73  ap functions ins
2590: 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  tead of our own.
25a0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
25b0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
25c0: 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69  ./*. * If this i
25d0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69  s non-zero, an i
25e0: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
25f0: 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79 20  l be created by 
2600: 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32  the native Win32
2610: 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75  . * allocator su
2620: 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69  bsystem; otherwi
2630: 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
2640: 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c  process heap wil
2650: 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69 73  l be used.  This
2660: 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20  . * setting has 
2670: 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20 63  no effect when c
2680: 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e  ompiling for Win
2690: 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  RT.  By default,
26a0: 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64   this is enabled
26b0: 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61  . * and an isola
26c0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
26d0: 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72   created to stor
26e0: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20  e all allocated 
26f0: 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a  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 0a 20 2a 20 57 41 52 4e  ********. * WARN
2750: 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72  ING: It is impor
2760: 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61  tant to note tha
2770: 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74 74  t when this sett
2780: 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ing is non-zero 
2790: 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20  and the. *      
27a0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
27b0: 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  wn function is c
27c0: 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74  alled (e.g. by t
27d0: 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  he sqlite3_shutd
27e0: 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20  own. *          
27f0: 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64  function), all d
2800: 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c  ata that was all
2810: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ocated using the
2820: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
2830: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ill. *          
2840: 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61  be freed immedia
2850: 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74  tely and any att
2860: 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61  empt to access a
2870: 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65 64  ny of that freed
2880: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  . *          dat
2890: 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65  a will almost ce
28a0: 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69  rtainly result i
28b0: 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61  n an immediate a
28c0: 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e  ccess violation.
28d0: 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . **************
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: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2930: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
2940: 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20  REATE.#  define 
2950: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2960: 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52 55  P_CREATE    (TRU
2970: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
2980: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   The initial siz
2990: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
29a0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
29b0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
29c0: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
29d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
29e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  HEAP_INIT_SIZE.#
29f0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2a00: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
2a10: 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45  SIZE ((SQLITE_DE
2a20: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
2a30: 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ) * \.          
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 28 53 51               (SQ
2a60: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2a70: 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30  E_SIZE) + 419430
2a80: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  4).#endif../*. *
2a90: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
2aa0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
2ab0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
2ac0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
2ad0: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
2ae0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2af0: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20  HEAP_MAX_SIZE.# 
2b00: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2b10: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
2b20: 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a  ZE  (0).#endif..
2b30: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
2b40: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
2b50: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
2b60: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
2b70: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
2b80: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
2b90: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
2ba0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
2bb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2bc0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
2bd0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2be0: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29  AP_FLAGS     (0)
2bf0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2c00: 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73  The winMemData s
2c10: 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20  tructure stores 
2c20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75  information requ
2c30: 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33  ired by the Win3
2c40: 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71  2-specific.** sq
2c50: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
2c60: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
2c70: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c80: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77  uct winMemData w
2c90: 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63  inMemData;.struc
2ca0: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23  t winMemData {.#
2cb0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2cc0: 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20 2f 2a  u32 magic1;   /*
2cd0: 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f   Magic number to
2ce0: 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72   detect structur
2cf0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f  e corruption. */
2d00: 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45  .#endif.  HANDLE
2d10: 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68   hHeap; /* The h
2d20: 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61  andle to our hea
2d30: 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77  p. */.  BOOL bOw
2d40: 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f  ned;  /* Do we o
2d50: 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e 65  wn the heap (i.e
2d60: 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20  . destroy it on 
2d70: 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69  shutdown)? */.#i
2d80: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75  fndef NDEBUG.  u
2d90: 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a 20  32 magic2;   /* 
2da0: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20  Magic number to 
2db0: 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65  detect structure
2dc0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a   corruption. */.
2dd0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64  #endif.};..#ifnd
2de0: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
2df0: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  e WINMEM_MAGIC1 
2e00: 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 23      0x42b2830b.#
2e10: 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41  define WINMEM_MA
2e20: 47 49 43 32 20 20 20 20 20 30 78 62 64 34 64 37  GIC2     0xbd4d7
2e30: 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  cf4.#endif..stat
2e40: 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ic struct winMem
2e50: 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  Data win_mem_dat
2e60: 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  a = {.#ifndef ND
2e70: 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41  EBUG.  WINMEM_MA
2e80: 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20 4e  GIC1,.#endif.  N
2e90: 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e 64  ULL, FALSE.#ifnd
2ea0: 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57 49 4e  ef NDEBUG.  ,WIN
2eb0: 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64 69  MEM_MAGIC2.#endi
2ec0: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
2ed0: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e  EBUG.#define win
2ee0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28  MemAssertMagic1(
2ef0: 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65  ) assert( win_me
2f00: 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d 57  m_data.magic1==W
2f10: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a 23  INMEM_MAGIC1 ).#
2f20: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
2f30: 65 72 74 4d 61 67 69 63 32 28 29 20 61 73 73 65  ertMagic2() asse
2f40: 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  rt( win_mem_data
2f50: 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f  .magic2==WINMEM_
2f60: 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69 6e 65  MAGIC2 ).#define
2f70: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2f80: 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73 73 65  ic()  winMemAsse
2f90: 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69 6e 4d  rtMagic1(); winM
2fa0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29  emAssertMagic2()
2fb0: 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ;.#else.#define 
2fc0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2fd0: 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  c().#endif..#def
2fe0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44 61 74  ine winMemGetDat
2ff0: 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d 65 6d  aPtr()  &win_mem
3000: 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20 77 69  _data.#define wi
3010: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 20 20  nMemGetHeap()   
3020: 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68    win_mem_data.h
3030: 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77 69 6e  Heap.#define win
3040: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 20 20  MemGetOwned()   
3050: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f   win_mem_data.bO
3060: 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76 6f 69  wned..static voi
3070: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
3080: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
3090: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
30a0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
30b0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
30c0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
30d0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
30e0: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
30f0: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
3100: 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20  oid *p);.static 
3110: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
3120: 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63  p(int n);.static
3130: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
3140: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
3150: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
3160: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
3170: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f   *pAppData);..co
3180: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
3190: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
31a0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
31b0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
31c0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
31d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
31e0: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
31f0: 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20  e is (normally) 
3200: 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76  set once and nev
3210: 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  er changes.** th
3220: 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65  ereafter.  It re
3230: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68  cords whether th
3240: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
3250: 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f  em is Win9x.** o
3260: 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30  r WinNT..**.** 0
3270: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
3280: 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  stem unknown..**
3290: 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   1:   Operating 
32a0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e  system is Win9x.
32b0: 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69  .** 2:   Operati
32c0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
32d0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  NT..**.** In ord
32e0: 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  er to facilitate
32f0: 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69   testing on a Wi
3300: 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20  nNT system, the 
3310: 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20  test fixture.** 
3320: 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74  can manually set
3330: 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31   this value to 1
3340: 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39   to emulate Win9
3350: 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23  8 behavior..*/.#
3360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3370: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  T.int sqlite3_os
3380: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 69 66  _type = 0;.#elif
3390: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
33a0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
33b0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
33c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
33d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
33e0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
33f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3400: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ).static int sql
3410: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
3420: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
3430: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
3440: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
3450: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
3460: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3470: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
3480: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
3490: 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69  Windows CE or Wi
34a0: 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51  nRT.. */..#if SQ
34b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
34c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
34d0: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65  .#  define osAre
34e0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20  FileApisANSI()  
34f0: 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f       1.#endif../
3500: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
3510: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
3520: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
3530: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
3540: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
3550: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
3560: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
3570: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
3580: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
3590: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
35a0: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
35b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
35c0: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
35d0: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
35e0: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
35f0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3600: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
3610: 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c  truct win_syscal
3620: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
3630: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
3640: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3650: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
3660: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3670: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
3680: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
3690: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
36a0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
36b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
36c0: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
36d0: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
36e0: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69  Syscall[] = {.#i
36f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3700: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
3710: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46  _WINRT.  { "AreF
3720: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
3730: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41        (SYSCALL)A
3740: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20  reFileApisANSI, 
3750: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3760: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
3770: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
3780: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
37b0: 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69  .#ifndef osAreFi
37c0: 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69  leApisANSI.#defi
37d0: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
37e0: 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ANSI ((BOOL(WINA
37f0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
3800: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
3810: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
3820: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3830: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3840: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3850: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3870: 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72  YSCALL)CharLower
3880: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
3890: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
38a0: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
38b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
38c0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
38e0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
38f0: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28   osCharLowerW ((
3900: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
3910: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
3920: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [1].pCurrent)..#
3930: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3940: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
3950: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3960: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70  IDE).  { "CharUp
3970: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
3980: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
3990: 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20  rUpperW,        
39a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
39b0: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
39c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
39d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3a00: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70  define osCharUpp
3a10: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
3a20: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
3a30: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
3a40: 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48  nt)..  { "CloseH
3a50: 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20  andle",         
3a60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f      (SYSCALL)Clo
3a70: 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  seHandle,       
3a80: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
3a90: 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  ine osCloseHandl
3aa0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
3ab0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
3ac0: 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[3].pCurrent).
3ad0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3ae0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3af0: 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  SI).  { "CreateF
3b00: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
3b10: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3b20: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
3b30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3b40: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
3b50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3b60: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3b90: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3ba0: 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leA ((HANDLE(WIN
3bb0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f  API*)(LPCSTR,DWO
3bc0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
3bd0: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
3be0: 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c  TTRIBUTES,DWORD,
3bf0: 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53  DWORD,HANDLE))aS
3c00: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
3c10: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
3c20: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
3c30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3c40: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3c50: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
3c60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3c70: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c  ALL)CreateFileW,
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3c90: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3ca0: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
3cb0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3cc0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ce0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3cf0: 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41  CreateFileW ((HA
3d00: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3d10: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
3d20: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
3d30: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3d40: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
3d50: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
3d60: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
3d70: 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  f (!SQLITE_OS_WI
3d80: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3da0: 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20  ANSI) && \.     
3db0: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
3dc0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20  TE_OMIT_WAL)).  
3dd0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
3de0: 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  pingA",      (SY
3df0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
3e00: 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30  MappingA,      0
3e10: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3e20: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3e30: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
3e40: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3e50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e60: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3e70: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
3e80: 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ingA ((HANDLE(WI
3e90: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
3ea0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3eb0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
3ec0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
3ed0: 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  ,LPCSTR))aSyscal
3ee0: 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[6].pCurrent)..
3ef0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3f00: 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f  NCE || (!SQLITE_
3f10: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3f20: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3f30: 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a  _HAS_WIDE) && \.
3f40: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
3f50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
3f60: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
3f70: 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20  leMappingW",    
3f80: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3f90: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20  eFileMappingW,  
3fa0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3fb0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3fc0: 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  ppingW",      (S
3fd0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4000: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
4010: 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44  eMappingW ((HAND
4020: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
4030: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
4040: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
4050: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
4060: 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61  DWORD,LPCWSTR))a
4070: 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72  Syscall[7].pCurr
4080: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4090: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
40a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
40b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
40c0: 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c   "CreateMutexW",
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
40e0: 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78  CALL)CreateMutex
40f0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  W,            0 
4100: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
4110: 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20  eateMutexW",    
4120: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4130: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4140: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4150: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4160: 73 43 72 65 61 74 65 4d 75 74 65 78 57 20 28 28  sCreateMutexW ((
4170: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
4180: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
4190: 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20  BUTES,BOOL, \.  
41a0: 20 20 20 20 20 20 4c 50 43 57 53 54 52 29 29 61        LPCWSTR))a
41b0: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
41c0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
41d0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
41e0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65  AS_ANSI).  { "De
41f0: 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  leteFileA",     
4200: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4210: 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20  )DeleteFileA,   
4220: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4230: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
4240: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
4250: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4280: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
4290: 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28  eteFileA ((BOOL(
42a0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
42b0: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
42c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
42d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
42e0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
42f0: 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20  DeleteFileW",   
4300: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4310: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20  LL)DeleteFileW, 
4320: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4330: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
4340: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
4350: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4370: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4380: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
4390: 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f  eleteFileW ((BOO
43a0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
43b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  TR))aSyscall[10]
43c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
43d0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
43e0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c    { "FileTimeToL
43f0: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28  ocalFileTime", (
4400: 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65  SYSCALL)FileTime
4410: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c  ToLocalFileTime,
4420: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4430: 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  "FileTimeToLocal
4440: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43  FileTime", (SYSC
4450: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4470: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4480: 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  e osFileTimeToLo
4490: 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f  calFileTime ((BO
44a0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
44b0: 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20  T FILETIME*, \. 
44c0: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
44d0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  E))aSyscall[11].
44e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
44f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
4500: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79   { "FileTimeToSy
4510: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53  stemTime",    (S
4520: 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54  YSCALL)FileTimeT
4530: 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20  oSystemTime,    
4540: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4550: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
4560: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
4570: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4580: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4590: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
45a0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73   osFileTimeToSys
45b0: 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  temTime ((BOOL(W
45c0: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49  INAPI*)(CONST FI
45d0: 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  LETIME*, \.     
45e0: 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29     LPSYSTEMTIME)
45f0: 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43  )aSyscall[12].pC
4600: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c  urrent)..  { "Fl
4610: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c  ushFileBuffers",
4620: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4630: 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  )FlushFileBuffer
4640: 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a  s,        0 },..
4650: 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46  #define osFlushF
4660: 69 6c 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f  ileBuffers ((BOO
4670: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4680: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e  E))aSyscall[13].
4690: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
46a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
46b0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
46c0: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
46d0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  A",          (SY
46e0: 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73  SCALL)FormatMess
46f0: 61 67 65 41 2c 20 20 20 20 20 20 20 20 20 20 30  ageA,          0
4700: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4710: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20  ormatMessageA", 
4720: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4730: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4740: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4750: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4760: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  osFormatMessageA
4770: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4780: 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c  )(DWORD,LPCVOID,
4790: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54  DWORD,DWORD,LPST
47a0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
47b0: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
47c0: 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65  scall[14].pCurre
47d0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
47e0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
47f0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72  S_WIDE).  { "For
4800: 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20  matMessageW",   
4810: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4820: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20  FormatMessageW, 
4830: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4840: 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  lse.  { "FormatM
4850: 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20  essageW",       
4860: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4890: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d  ..#define osForm
48a0: 61 74 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f  atMessageW ((DWO
48b0: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
48c0: 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  D,LPCVOID,DWORD,
48d0: 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a  DWORD,LPWSTR, \.
48e0: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
48f0: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
4900: 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [15].pCurrent)..
4910: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4920: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
4930: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46 72  TENSION).  { "Fr
4940: 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  eeLibrary",     
4950: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4960: 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20  )FreeLibrary,   
4970: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4980: 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65 4c 69  else.  { "FreeLi
4990: 62 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20  brary",         
49a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
49d0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65  f..#define osFre
49e0: 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28  eLibrary ((BOOL(
49f0: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
4a00: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
4a10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4a20: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
4a30: 49 64 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  Id",     (SYSCAL
4a40: 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  L)GetCurrentProc
4a50: 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a  essId,     0 },.
4a60: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75  .#define osGetCu
4a70: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28  rrentProcessId (
4a80: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4a90: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  VOID))aSyscall[1
4aa0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
4ab0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4ac0: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4ad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
4ae0: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73  NSI).  { "GetDis
4af0: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
4b00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4b10: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20  DiskFreeSpaceA, 
4b20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4b30: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
4b40: 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20  eSpaceA",       
4b50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4b80: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
4b90: 46 72 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f  FreeSpaceA ((BOO
4ba0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
4bb0: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
4bc0: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
4bd0: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
4be0: 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72  yscall[18].pCurr
4bf0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4c00: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
4c10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4c20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4c30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4c40: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
4c50: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
4c60: 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b  (SYSCALL)GetDisk
4c70: 46 72 65 65 53 70 61 63 65 57 2c 20 20 20 20 20  FreeSpaceW,     
4c80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4c90: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
4ca0: 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceW",       (SYS
4cb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4cd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4ce0: 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65  ne osGetDiskFree
4cf0: 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49  SpaceW ((BOOL(WI
4d00: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c  NAPI*)(LPCWSTR,L
4d10: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c  PDWORD,LPDWORD,L
4d20: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
4d30: 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63    LPDWORD))aSysc
4d40: 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74  all[19].pCurrent
4d50: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4d60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4d70: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69  ANSI).  { "GetFi
4d80: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
4d90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4da0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
4db0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
4dc0: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4dd0: 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20  tributesA",     
4de0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4e10: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
4e20: 65 41 74 74 72 69 62 75 74 65 73 41 20 28 28 44  eAttributesA ((D
4e30: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
4e40: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
4e50: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4e60: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4e70: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
4e80: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4e90: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
4ea0: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
4eb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4ec0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c  FileAttributesW,
4ed0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4ee0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4ef0: 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20  ributesW",      
4f00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4f30: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
4f40: 41 74 74 72 69 62 75 74 65 73 57 20 28 28 44 57  AttributesW ((DW
4f50: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
4f60: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
4f70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4f80: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4f90: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4fa0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4fb0: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
4fc0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
4fd0: 41 74 74 72 69 62 75 74 65 73 45 78 57 2c 20 20  AttributesExW,  
4fe0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4ff0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
5000: 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53  tesExW",    (SYS
5010: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5030: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5040: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
5050: 69 62 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c  ibutesExW ((BOOL
5060: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
5070: 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46  R,GET_FILEEX_INF
5080: 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20  O_LEVELS, \.    
5090: 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73      LPVOID))aSys
50a0: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
50b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
50c0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
50d0: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
50e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
50f0: 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20  )GetFileSize,   
5100: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5110: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
5120: 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  eSize",         
5130: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5160: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5170: 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44  FileSize ((DWORD
5180: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5190: 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61  ,LPDWORD))aSysca
51a0: 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[23].pCurrent)
51b0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
51c0: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
51d0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
51e0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
51f0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
5200: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5210: 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  )GetFullPathName
5220: 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  A,        0 },.#
5230: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c  else.  { "GetFul
5240: 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20  lPathNameA",    
5250: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5280: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5290: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28  FullPathNameA ((
52a0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
52b0: 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54  PCSTR,DWORD,LPST
52c0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  R, \.        LPS
52d0: 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34  TR*))aSyscall[24
52e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
52f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5300: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
5310: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
5320: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5330: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
5340: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
5350: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5360: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
5370: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
5380: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  lse.  { "GetFull
5390: 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20  PathNameW",     
53a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
53d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
53e0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44  ullPathNameW ((D
53f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
5400: 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53  CWSTR,DWORD,LPWS
5410: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  TR, \.        LP
5420: 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  WSTR*))aSyscall[
5430: 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  25].pCurrent).. 
5440: 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72   { "GetLastError
5450: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5460: 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72  YSCALL)GetLastEr
5470: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
5480: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5490: 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44  GetLastError ((D
54a0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
54b0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d  ID))aSyscall[26]
54c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
54d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
54e0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
54f0: 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54 45 5f  ION).#if SQLITE_
5500: 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68  OS_WINCE.  /* Th
5510: 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  e GetProcAddress
5520: 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  A() routine is o
5530: 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
5540: 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a   Windows CE. */.
5550: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5560: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5570: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5580: 64 64 72 65 73 73 41 2c 20 20 20 20 20 20 20 20  ddressA,        
5590: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a   0 },.#else.  /*
55a0: 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f   All other Windo
55b0: 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70  ws platforms exp
55c0: 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65  ect GetProcAddre
55d0: 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a  ss() to take.  *
55e0: 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  * an ANSI string
55f0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
5600: 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74  he _UNICODE sett
5610: 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50  ing */.  { "GetP
5620: 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20  rocAddressA",   
5630: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5640: 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20  etProcAddress,  
5650: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5660: 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47  dif.#else.  { "G
5670: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
5680: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5690: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
56a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
56b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
56c0: 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  osGetProcAddress
56d0: 41 20 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41  A ((FARPROC(WINA
56e0: 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a  PI*)(HMODULE, \.
56f0: 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 29 29          LPCSTR))
5700: 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75  aSyscall[27].pCu
5710: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5720: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5730: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
5740: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5750: 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e  CALL)GetSystemIn
5760: 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  fo,           0 
5770: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5780: 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  tSystemInfo",   
5790: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
57a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
57b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
57c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
57d0: 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28  sGetSystemInfo (
57e0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
57f0: 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53  PSYSTEM_INFO))aS
5800: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
5810: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79  ent)..  { "GetSy
5820: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20  stemTime",      
5830: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5840: 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20  tSystemTime,    
5850: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5860: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
5870: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
5880: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d  PI*)(LPSYSTEMTIM
5890: 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e  E))aSyscall[29].
58a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
58b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
58c0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
58d0: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
58e0: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
58f0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c  mTimeAsFileTime,
5900: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5910: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  "GetSystemTimeAs
5920: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43  FileTime", (SYSC
5930: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5950: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5960: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d  e osGetSystemTim
5970: 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f  eAsFileTime ((VO
5980: 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  ID(WINAPI*)( \. 
5990: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
59a0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e  E))aSyscall[30].
59b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
59c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
59d0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
59e0: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
59f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5a00: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
5a10: 68 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hA,            0
5a20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5a30: 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20  etTempPathA",   
5a40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5a50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5a60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5a70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5a80: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 20 28  osGetTempPathA (
5a90: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5aa0: 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79  DWORD,LPSTR))aSy
5ab0: 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65  scall[31].pCurre
5ac0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5ad0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5ae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5af0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
5b00: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
5b10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5b20: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57  ALL)GetTempPathW
5b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5b40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5b50: 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20  TempPathW",     
5b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5b70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b90: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5ba0: 47 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44  GetTempPathW ((D
5bb0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5bc0: 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73  ORD,LPWSTR))aSys
5bd0: 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e  call[32].pCurren
5be0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5bf0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
5c00: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
5c10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5c20: 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20  )GetTickCount,  
5c30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5c40: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63  else.  { "GetTic
5c50: 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  kCount",        
5c60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5c90: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5ca0: 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52  TickCount ((DWOR
5cb0: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
5cc0: 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43  )aSyscall[33].pC
5cd0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5ce0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5cf0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 64  2_HAS_ANSI) && d
5d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5d10: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
5d20: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53  ) && \.        S
5d30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5d40: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
5d50: 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20  tVersionExA",   
5d60: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5d70: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20  )GetVersionExA, 
5d80: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5d90: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
5da0: 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20  sionExA",       
5db0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5de0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5df0: 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f  VersionExA ((BOO
5e00: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
5e10: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
5e20: 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c  NINFOA))aSyscall
5e30: 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [34].pCurrent)..
5e40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5e50: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
5e60: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5e70: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
5e80: 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49      defined(SQLI
5e90: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
5ea0: 49 4f 4e 45 58 29 20 26 26 20 53 51 4c 49 54 45  IONEX) && SQLITE
5eb0: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
5ec0: 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73  NEX.  { "GetVers
5ed0: 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20  ionExW",        
5ee0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
5ef0: 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20 20 20  ersionExW,      
5f00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5f10: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
5f20: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xW",           (
5f30: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5f60: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
5f70: 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e  onExW ((BOOL(WIN
5f80: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
5f90: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
5fa0: 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e  W))aSyscall[35].
5fb0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5fc0: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20  HeapAlloc",     
5fd0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5fe0: 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20  LL)HeapAlloc,   
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6000: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6010: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
6020: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6030: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6040: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6050: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [36].pCurrent)..
6060: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6070: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72  INRT.  { "HeapCr
6080: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
6090: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
60a0: 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  pCreate,        
60b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
60c0: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
60d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
60e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6110: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65  define osHeapCre
6120: 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ate ((HANDLE(WIN
6130: 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45  API*)(DWORD,SIZE
6140: 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  _T, \.        SI
6150: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
6160: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
6170: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6180: 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74  RT.  { "HeapDest
6190: 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  roy",           
61a0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44    (SYSCALL)HeapD
61b0: 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20  estroy,         
61c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
61d0: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
61e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
61f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6220: 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72  fine osHeapDestr
6230: 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  oy ((BOOL(WINAPI
6240: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
6250: 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74  all[38].pCurrent
6260: 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65  )..  { "HeapFree
6270: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6280: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46    (SYSCALL)HeapF
6290: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
62a0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
62b0: 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42  e osHeapFree ((B
62c0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
62d0: 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44  DLE,DWORD,LPVOID
62e0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70  ))aSyscall[39].p
62f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
6300: 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20  eapReAlloc",    
6310: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6320: 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20  L)HeapReAlloc,  
6330: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6340: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52  .#define osHeapR
6350: 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28  eAlloc ((LPVOID(
6360: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6370: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a  DWORD,LPVOID, \.
6380: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
6390: 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75  aSyscall[40].pCu
63a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
63b0: 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  pSize",         
63c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
63d0: 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20  HeapSize,       
63e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
63f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a  define osHeapSiz
6400: 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50  e ((SIZE_T(WINAP
6410: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6420: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56  , \.        LPCV
6430: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31  OID))aSyscall[41
6440: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6450: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6460: 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64  T.  { "HeapValid
6470: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
6480: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61   (SYSCALL)HeapVa
6490: 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  lidate,         
64a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
64b0: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
64c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
64d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
64f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6500: 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61  ine osHeapValida
6510: 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  te ((BOOL(WINAPI
6520: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6530: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
6540: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d  ID))aSyscall[42]
6550: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6560: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
6570: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
6580: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43 6f  INRT.  { "HeapCo
6590: 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20 20  mpact",         
65a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
65b0: 70 43 6f 6d 70 61 63 74 2c 20 20 20 20 20 20 20  pCompact,       
65c0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
65d0: 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63  .  { "HeapCompac
65e0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
65f0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6620: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d  define osHeapCom
6630: 70 61 63 74 20 28 28 55 49 4e 54 28 57 49 4e 41  pact ((UINT(WINA
6640: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6650: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e  D))aSyscall[43].
6660: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6670: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6680: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
6690: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
66a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
66b0: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  SION).  { "LoadL
66c0: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
66d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
66e0: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
66f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6700: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
6710: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
6720: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6750: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
6760: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
6770: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
6780: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
6790: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
67a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
67b0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
67c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
67d0: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
67e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
67f0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
6800: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
6810: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
6820: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
6830: 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20  ibraryW,        
6840: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6850: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
6860: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6870: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
68a0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
68b0: 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryW ((HMODULE(WI
68c0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
68d0: 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75  aSyscall[45].pCu
68e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
68f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6900: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
6910: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6920: 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20  CALL)LocalFree, 
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6940: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6950: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20  calFree",       
6960: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6970: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6980: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6990: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
69a0: 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f  sLocalFree ((HLO
69b0: 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f  CAL(WINAPI*)(HLO
69c0: 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 36  CAL))aSyscall[46
69d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
69e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
69f0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
6a00: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46  WINRT.  { "LockF
6a10: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6a20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
6a30: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
6a40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6a50: 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  e.  { "LockFile"
6a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a70: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6aa0: 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69  #ifndef osLockFi
6ab0: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  le.#define osLoc
6ac0: 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  kFile ((BOOL(WIN
6ad0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6ae0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
6af0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6b00: 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43  )aSyscall[47].pC
6b10: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
6b20: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6b30: 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  INCE.  { "LockFi
6b40: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
6b50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
6b60: 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20  kFileEx,        
6b70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6b80: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78  .  { "LockFileEx
6b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6ba0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6bd0: 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c  ifndef osLockFil
6be0: 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  eEx.#define osLo
6bf0: 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28  ckFileEx ((BOOL(
6c00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6c10: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6c20: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6c30: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
6c40: 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43  )aSyscall[48].pC
6c50: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
6c60: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6c70: 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f  NCE || (!SQLITE_
6c80: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
6c90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ca0: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56  _WAL)).  { "MapV
6cb0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
6cc0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d        (SYSCALL)M
6cd0: 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20  apViewOfFile,   
6ce0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6cf0: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
6d00: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6d10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6d40: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
6d50: 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49  ewOfFile ((LPVOI
6d60: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
6d70: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6d80: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
6d90: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
6da0: 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  49].pCurrent).. 
6db0: 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57   { "MultiByteToW
6dc0: 69 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53  ideChar",     (S
6dd0: 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65  YSCALL)MultiByte
6de0: 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20  ToWideChar,     
6df0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6e00: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
6e10: 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49  har ((int(WINAPI
6e20: 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50  *)(UINT,DWORD,LP
6e30: 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c  CSTR,int,LPWSTR,
6e40: 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29   \.        int))
6e50: 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75  aSyscall[50].pCu
6e60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65  rrent)..  { "Que
6e70: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
6e80: 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29  nter", (SYSCALL)
6e90: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
6ea0: 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23  Counter, 0 },..#
6eb0: 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65  define osQueryPe
6ec0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
6ed0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6ee0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47  ( \.        LARG
6ef0: 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73  E_INTEGER*))aSys
6f00: 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e  call[51].pCurren
6f10: 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c  t)..  { "ReadFil
6f20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6f30: 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64     (SYSCALL)Read
6f40: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6f50: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6f60: 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28  ne osReadFile ((
6f70: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f80: 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52  NDLE,LPVOID,DWOR
6f90: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
6fa0: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
6fb0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e  D))aSyscall[52].
6fc0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6fd0: 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20  SetEndOfFile",  
6fe0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6ff0: 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c  LL)SetEndOfFile,
7000: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7010: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45  ..#define osSetE
7020: 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ndOfFile ((BOOL(
7030: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
7040: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
7050: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
7060: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7070: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
7080: 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  r",          (SY
7090: 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69  SCALL)SetFilePoi
70a0: 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30  nter,          0
70b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
70c0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20  etFilePointer", 
70d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
70e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
70f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7100: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7110: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
7120: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
7130: 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c  )(HANDLE,LONG,PL
7140: 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ONG, \.        D
7150: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
7160: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
7170: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7180: 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20  RT.  { "Sleep", 
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70    (SYSCALL)Sleep
71b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
71d0: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
71f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7220: 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56  fine osSleep ((V
7230: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  OID(WINAPI*)(DWO
7240: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d  RD))aSyscall[55]
7250: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7260: 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  "SystemTimeToFil
7270: 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43  eTime",    (SYSC
7280: 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f  ALL)SystemTimeTo
7290: 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d  FileTime,    0 }
72a0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73  ,..#define osSys
72b0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
72c0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
72d0: 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49  )(CONST SYSTEMTI
72e0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
72f0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
7300: 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74  all[56].pCurrent
7310: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
7320: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
7330: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7340: 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  "UnlockFile",   
7350: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7360: 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20  ALL)UnlockFile, 
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7380: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c  ,.#else.  { "Unl
7390: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
73a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
73b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
73c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
73d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
73e0: 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  UnlockFile.#defi
73f0: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20  ne osUnlockFile 
7400: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7410: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
7420: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
7430: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
7440: 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74  all[57].pCurrent
7450: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ).#endif..#if !S
7460: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
7470: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   { "UnlockFileEx
7480: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
7490: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
74a0: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  eEx,            
74b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
74c0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20  UnlockFileEx",  
74d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
74e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7500: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7510: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20   osUnlockFileEx 
7520: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7530: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
7540: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
7550: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
7560: 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70  ))aSyscall[58].p
7570: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7580: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
7590: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
75a0: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22  _OMIT_WAL).  { "
75b0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
75c0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
75d0: 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  LL)UnmapViewOfFi
75e0: 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  le,         0 },
75f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61  .#else.  { "Unma
7600: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
7610: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7630: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7640: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55  dif..#define osU
7650: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  nmapViewOfFile (
7660: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
7670: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
7680: 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [59].pCurrent)..
7690: 20 20 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d    { "WideCharToM
76a0: 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20 20 28  ultiByte",     (
76b0: 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72  SYSCALL)WideChar
76c0: 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20  ToMultiByte,    
76d0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
76e0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
76f0: 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50  Byte ((int(WINAP
7700: 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c  I*)(UINT,DWORD,L
7710: 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52  PCWSTR,int,LPSTR
7720: 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20  ,int, \.        
7730: 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61  LPCSTR,LPBOOL))a
7740: 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72  Syscall[60].pCur
7750: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74  rent)..  { "Writ
7760: 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  eFile",         
7770: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57        (SYSCALL)W
7780: 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20  riteFile,       
7790: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
77a0: 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c  efine osWriteFil
77b0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
77c0: 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44  )(HANDLE,LPCVOID
77d0: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
77e0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
77f0: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
7800: 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [61].pCurrent)..
7810: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7820: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45  NRT.  { "CreateE
7830: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
7840: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
7850: 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20  teEventExW,     
7860: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7870: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74    { "CreateEvent
7880: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  ExW",          (
7890: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
78c0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76  efine osCreateEv
78d0: 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28  entExW ((HANDLE(
78e0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
78f0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c  ITY_ATTRIBUTES,L
7900: 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  PCWSTR, \.      
7910: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61    DWORD,DWORD))a
7920: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
7930: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7940: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7950: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7960: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
7970: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
7980: 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d  eObject,     0 }
7990: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69  ,.#else.  { "Wai
79a0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
79b0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
79c0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
79d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
79e0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
79f0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7a00: 65 63 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ect ((DWORD(WINA
7a10: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
7a20: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7a30: 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72  yscall[63].pCurr
7a40: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7a50: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
7a60: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7a70: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
7a80: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
7a90: 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a  bjectEx,   0 },.
7aa0: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
7ab0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
7ac0: 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ",   (SYSCALL)0,
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7af0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
7b00: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7b10: 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41  tEx ((DWORD(WINA
7b20: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7b30: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f  D, \.        BOO
7b40: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e  L))aSyscall[64].
7b50: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7b70: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7b80: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
7b90: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
7ba0: 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20  interEx,        
7bb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7bc0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
7bd0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
7be0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7c00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7c10: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
7c20: 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  rEx ((BOOL(WINAP
7c30: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45  I*)(HANDLE,LARGE
7c40: 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20  _INTEGER, \.    
7c50: 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47      PLARGE_INTEG
7c60: 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  ER,DWORD))aSysca
7c70: 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[65].pCurrent)
7c80: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7c90: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69  WINRT.  { "GetFi
7ca0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7cb0: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
7cc0: 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  LL)GetFileInform
7cd0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c  ationByHandleEx,
7ce0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7cf0: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
7d00: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
7d10: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7d30: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7d40: 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  e osGetFileInfor
7d50: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7d60: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7d70: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
7d80: 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f     FILE_INFO_BY_
7d90: 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56  HANDLE_CLASS,LPV
7da0: 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63  OID,DWORD))aSysc
7db0: 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74  all[66].pCurrent
7dc0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7dd0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
7de0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
7df0: 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  AL).  { "MapView
7e00: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
7e10: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
7e20: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
7e30: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
7e40: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
7e50: 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28  leFromApp",    (
7e60: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7e90: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
7ea0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c  fFileFromApp ((L
7eb0: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
7ec0: 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  ANDLE,ULONG,ULON
7ed0: 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  G64, \.        S
7ee0: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
7ef0: 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  67].pCurrent)..#
7f00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7f10: 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  RT.  { "CreateFi
7f20: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
7f30: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
7f40: 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20  eFile2,         
7f50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7f60: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
7f70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
7f80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7fb0: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
7fc0: 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  e2 ((HANDLE(WINA
7fd0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
7fe0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
7ff0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41  \.        LPCREA
8000: 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
8010: 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79  _PARAMETERS))aSy
8020: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
8030: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8040: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
8050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8060: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
8070: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
8080: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
8090: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63  (SYSCALL)LoadPac
80a0: 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20  kagedLibrary,   
80b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
80c0: 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69   "LoadPackagedLi
80d0: 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53  brary",     (SYS
80e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8100: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8110: 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65  ne osLoadPackage
8120: 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55  dLibrary ((HMODU
8130: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
8140: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
8150: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
8160: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
8170: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8180: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
8190: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
81a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
81b0: 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20  kCount64,       
81c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
81d0: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  { "GetTickCount6
81e0: 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  4",          (SY
81f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8210: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8220: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
8230: 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47  nt64 ((ULONGLONG
8240: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
8250: 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75  aSyscall[70].pCu
8260: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8270: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8280: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
8290: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
82a0: 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73  ALL)GetNativeSys
82b0: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d  temInfo,     0 }
82c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
82d0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
82e0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
82f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8300: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8310: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8320: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8330: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
8340: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
8350: 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53  PSYSTEM_INFO))aS
8360: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
8370: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
8380: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8390: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75  AS_ANSI).  { "Ou
83a0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
83b0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
83c0: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
83d0: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
83e0: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
83f0: 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20  DebugStringA",  
8400: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8430: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8440: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20  putDebugStringA 
8450: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8460: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
8470: 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [72].pCurrent)..
8480: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8490: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
84a0: 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  E).  { "OutputDe
84b0: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
84c0: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
84d0: 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20  tDebugStringW,  
84e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
84f0: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8500: 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  tringW",      (S
8510: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8540: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8550: 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44  ugStringW ((VOID
8560: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
8570: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e  R))aSyscall[73].
8580: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
8590: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c  GetProcessHeap",
85a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
85b0: 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61  LL)GetProcessHea
85c0: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
85d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
85e0: 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e  rocessHeap ((HAN
85f0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  DLE(WINAPI*)(VOI
8600: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e  D))aSyscall[74].
8610: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8620: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8630: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
8640: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20  E_OMIT_WAL).  { 
8650: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
8660: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
8670: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
8680: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30  appingFromApp, 0
8690: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
86a0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
86b0: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
86c0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
86d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
86e0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
86f0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
8700: 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e  ingFromApp ((HAN
8710: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
8720: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
8730: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
8740: 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  UTES,ULONG,ULONG
8750: 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73  64,LPCWSTR))aSys
8760: 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e  call[75].pCurren
8770: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
8780: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
8790: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
87a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
87b0: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
87c0: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
87d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
87e0: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
87f0: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
8800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
8810: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
8820: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
8830: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
8840: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
8850: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
8860: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
8870: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
8880: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
8890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
88a0: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
88b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
88c0: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
88d0: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
88e0: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
88f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8900: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
8910: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
8920: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
8930: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
8940: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
8950: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
8960: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
8970: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
8980: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
8990: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
89a0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
89b0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
89c0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
89d0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
89e0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
89f0: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
8a00: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
8a10: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
8a20: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
8a30: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
8a40: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
8a50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
8a60: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
8a70: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
8a80: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
8a90: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
8aa0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
8ab0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
8ac0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8ad0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
8ae0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8af0: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
8b00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8b10: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
8b20: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
8b30: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
8b40: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
8b50: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
8b60: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
8b70: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8b80: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8b90: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8ba0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
8bb0: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
8bc0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
8bd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
8be0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8bf0: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
8c00: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
8c10: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
8c20: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
8c30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8c40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
8c50: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
8c60: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
8c70: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
8c80: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
8c90: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
8ca0: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
8cb0: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
8cc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8cd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8ce0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
8cf0: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
8d00: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
8d10: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8d20: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
8d30: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
8d40: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
8d50: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
8d60: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
8d70: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
8d80: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
8d90: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
8da0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
8db0: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
8dc0: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8dd0: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
8de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8df0: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
8e00: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
8e10: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
8e20: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
8e30: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
8e40: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
8e50: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
8e60: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
8e70: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
8e80: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
8e90: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
8ea0: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
8eb0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8ec0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
8ed0: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
8ee0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
8ef0: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
8f00: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
8f10: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
8f20: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
8f30: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
8f40: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
8f50: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
8f60: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
8f70: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
8f80: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
8f90: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
8fa0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
8fb0: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
8fc0: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
8fd0: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
8fe0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
8ff0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
9000: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9010: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
9020: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
9030: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
9040: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
9050: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
9060: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9070: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9080: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9090: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
90a0: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
90b0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
90c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
90d0: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
90e0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
90f0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
9100: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
9110: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9120: 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69  OC./*.** If a Wi
9130: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9140: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
9150: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9160: 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  on will attempt 
9170: 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74  to.** compact it
9180: 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  .  Upon success,
9190: 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20   SQLITE_OK will 
91a0: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70  be returned.  Up
91b0: 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a  on failure, one.
91c0: 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** of SQLITE_NOM
91d0: 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  EM, SQLITE_ERROR
91e0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
91f0: 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74  OUND will be ret
9200: 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22  urned.  The.** "
9210: 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d  pnLargest" argum
9220: 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f  ent, if non-zero
9230: 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  , will be used t
9240: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a  o return the siz
9250: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67  e of the.** larg
9260: 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72  est committed fr
9270: 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20  ee block in the 
9280: 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a  heap, in bytes..
9290: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
92a0: 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61  in32_compact_hea
92b0: 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65  p(LPUINT pnLarge
92c0: 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
92d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e  SQLITE_OK;.  UIN
92e0: 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  T nLargest = 0;.
92f0: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
9300: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
9310: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
9320: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
9330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
9340: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
9350: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9360: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9370: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9380: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9390: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
93a0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
93b0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
93c0: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
93d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
93e0: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
93f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  ;.#endif.#if !SQ
9400: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
9410: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
9420: 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73  T.  if( (nLarges
9430: 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28  t=osHeapCompact(
9440: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9450: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29  N32_HEAP_FLAGS))
9460: 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  ==0 ){.    DWORD
9470: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
9480: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
9490: 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
94a0: 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  ==NO_ERROR ){.  
94b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
94c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
94d0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
94e0: 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c  pact (no space),
94f0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
9510: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
9520: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
9530: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
9540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
9550: 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  g(SQLITE_ERROR, 
9560: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
9570: 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65  ompact (%lu), he
9580: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9590: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
95a0: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
95b0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
95c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
95d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
95e0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  lse.  sqlite3_lo
95f0: 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  g(SQLITE_NOTFOUN
9600: 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  D, "failed to He
9610: 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d  apCompact, heap=
9620: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9630: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
9640: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
9650: 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66  NOTFOUND;.#endif
9660: 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74  .  if( pnLargest
9670: 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20   ) *pnLargest = 
9680: 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75  nLargest;.  retu
9690: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
96a0: 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76  If a Win32 nativ
96b0: 65 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20  e heap has been 
96c0: 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73  configured, this
96d0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
96e0: 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73  ttempt to.** des
96f0: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
9700: 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69  e it.  If the Wi
9710: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9720: 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20  is not isolated 
9730: 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71  and/or.** the sq
9740: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9750: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  d() function doe
9760: 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72  s not return zer
9770: 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  o, SQLITE_BUSY w
9780: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
9790: 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65  ed and no change
97a0: 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  s will be made t
97b0: 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  o the Win32 nati
97c0: 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20  ve heap..*/.int 
97d0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65  sqlite3_win32_re
97e0: 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e  set_heap(){.  in
97f0: 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  t rc;.  MUTEX_LO
9800: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
9810: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f  ex *pMaster; ) /
9820: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
9830: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
9840: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
9850: 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29  3_mutex *pMem; )
9860: 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79      /* The memsy
9870: 73 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  s static mutex *
9880: 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  /.  MUTEX_LOGIC(
9890: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
98a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
98b0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
98c0: 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55  _MASTER); ).  MU
98d0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20  TEX_LOGIC( pMem 
98e0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
98f0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9900: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a  _STATIC_MEM); ).
9910: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9920: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
9930: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9940: 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77  enter(pMem);.  w
9950: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
9960: 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d  ();.  if( winMem
9970: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
9980: 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  && winMemGetOwne
9990: 64 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d  d() && sqlite3_m
99a0: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
99b0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
99c0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
99d0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
99e0: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d  no outstanding m
99f0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9a00: 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  s on.    ** the 
9a10: 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e  heap.  Also, sin
9a20: 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74  ce both the mast
9a30: 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f  er and memsys lo
9a40: 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  cks are currentl
9a50: 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68  y.    ** being h
9a60: 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74  eld by us, no ot
9a70: 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e  her function (i.
9a80: 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  e. from another 
9a90: 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20  thread) should. 
9aa0: 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f     ** be able to
9ab0: 20 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65   even access the
9ac0: 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20   heap.  Attempt 
9ad0: 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  to destroy and r
9ae0: 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20  ecreate our.    
9af0: 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33  ** isolated Win3
9b00: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f  2 native heap no
9b10: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
9b20: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48  sert( winMemGetH
9b30: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9b40: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
9b50: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
9b60: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9b70: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
9b80: 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65  ==0 );.    winMe
9b90: 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d  mShutdown(winMem
9ba0: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
9bb0: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
9bc0: 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c  mGetHeap()==NULL
9bd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9be0: 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28  !winMemGetOwned(
9bf0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9c00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
9c10: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
9c20: 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74   rc = winMemInit
9c30: 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74  (winMemGetDataPt
9c40: 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r());.    assert
9c50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9c60: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  || winMemGetHeap
9c70: 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()!=NULL );.    
9c80: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9c90: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
9ca0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
9cb0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
9cc0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
9cd0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9ce0: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
9cf0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
9d00: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9d10: 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64  ap cannot be mod
9d20: 69 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74  ified because it
9d30: 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a   may be in use..
9d40: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
9d50: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
9d60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9d70: 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20  _leave(pMem);.  
9d80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9d90: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
9da0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
9db0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
9dc0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
9dd0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9de0: 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73  on outputs the s
9df0: 70 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20  pecified (ANSI) 
9e00: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69  string to the Wi
9e10: 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n32 debugger.** 
9e20: 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
9e30: 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */..void sqlite3
9e40: 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62  _win32_write_deb
9e50: 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ug(const char *z
9e60: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
9e70: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
9e80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
9e90: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
9ea0: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
9eb0: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
9ec0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
9ed0: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
9ee0: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
9ef0: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
9f00: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
9f10: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
9f20: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
9f30: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
9f40: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
9f50: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
9f60: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
9f70: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9f80: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
9f90: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
9fa0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
9fb0: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
9fc0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
9fd0: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
9fe0: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
9ff0: 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75  in);.    osOutpu
a000: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44  tDebugStringA(zD
a010: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
a020: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
a030: 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b  ugStringA(zBuf);
a040: 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e  .  }.#elif defin
a050: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
a060: 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73  HAS_WIDE).  mems
a070: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a090: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20  BUF_SIZE);.  if 
a0a0: 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  ( osMultiByteToW
a0b0: 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20  ideChar(.       
a0c0: 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73     osAreFileApis
a0d0: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
a0e0: 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a  : CP_OEMCP, 0, z
a0f0: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  Buf,.          n
a100: 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62  Min, (LPWSTR)zDb
a110: 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e  gBuf, SQLITE_WIN
a120: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f  32_DBG_BUF_SIZE/
a130: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d  sizeof(WCHAR))<=
a140: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
a150: 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44  .  }.  osOutputD
a160: 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43  ebugStringW((LPC
a170: 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23  WSTR)zDbgBuf);.#
a180: 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  else.  if( nMin>
a190: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
a1a0: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
a1b0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a1c0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
a1d0: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
a1e0: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72  , nMin);.    fpr
a1f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a200: 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  ", zDbgBuf);.  }
a210: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
a220: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
a230: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zBuf);.  }.#endi
a240: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
a250: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
a260: 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75   suspends the cu
a270: 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72  rrent thread for
a280: 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20   at least ms.** 
a290: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
a2a0: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
a2b0: 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53  t to the Win32 S
a2c0: 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65  leep() interface
a2d0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
a2e0: 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20  OS_WINRT.static 
a2f0: 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20  HANDLE sleepObj 
a300: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
a310: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
a320: 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d  32_sleep(DWORD m
a330: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69  illiseconds){.#i
a340: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
a350: 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62  T.  if ( sleepOb
a360: 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  j==NULL ){.    s
a370: 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61  leepObj = osCrea
a380: 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c  teEventExW(NULL,
a390: 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
a3a0: 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
a3b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a    SYNCHRONIZE);.
a3e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c    }.  assert( sl
a3f0: 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a  eepObj!=NULL );.
a400: 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c    osWaitForSingl
a410: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
a420: 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  bj, milliseconds
a430: 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a  , FALSE);.#else.
a440: 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73    osSleep(millis
a450: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
a460: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a470: 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
a480: 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
a490: 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57  g under WinNT, W
a4a0: 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20  in2K, WinXP,.** 
a4b0: 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72  or WinCE.  Retur
a4c0: 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66  n false (zero) f
a4d0: 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  or Win95, Win98,
a4e0: 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a   or WinME..**.**
a4f0: 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65   Here is an inte
a500: 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74  resting observat
a510: 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e  ion:  Win95, Win
a520: 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61  98, and WinME la
a530: 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ck.** the LockFi
a540: 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74  leEx() API.  But
a550: 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74   we can still st
a560: 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67  atically link ag
a570: 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50  ainst that.** AP
a580: 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20  I as long as we 
a590: 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68  don't call it wh
a5a0: 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35  en running Win95
a5b0: 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20  /98/ME.  A call 
a5c0: 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
a5d0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
a5e0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68  termine if the h
a5f0: 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f  ost is Win95/98/
a600: 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32  ME or.** WinNT/2
a610: 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20  K/XP so that we 
a620: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65  will know whethe
a630: 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20  r or not we can 
a640: 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74  safely call.** t
a650: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
a660: 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 64 65  API..*/..#if !de
a670: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a680: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29  32_GETVERSIONEX)
a690: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 57 49 4e 33   || !SQLITE_WIN3
a6a0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23  2_GETVERSIONEX.#
a6b0: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
a6c0: 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49    (1).#elif SQLI
a6d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
a6e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c  QLITE_OS_WINRT |
a6f0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
a700: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
a710: 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  ).# define osIsN
a720: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21  T()  (1).#elif !
a730: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
a740: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23  IN32_HAS_WIDE).#
a750: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
a760: 20 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73 74    (0).#else.  st
a770: 61 74 69 63 20 69 6e 74 20 6f 73 49 73 4e 54 28  atic int osIsNT(
a780: 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73  void){.    if( s
a790: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d  qlite3_os_type==
a7a0: 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  0 ){.#if defined
a7b0: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
a7c0: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
a7d0: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 38 0a 20   >= NTDDI_WIN8. 
a7e0: 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e       OSVERSIONIN
a7f0: 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20  FOW sInfo;.     
a800: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
a810: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
a820: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
a830: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
a840: 57 28 26 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65  W(&sInfo);.#else
a850: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
a860: 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOA sInfo;.   
a870: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
a880: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
a890: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
a8a0: 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e      osGetVersion
a8b0: 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 23 65 6e  ExA(&sInfo);.#en
a8c0: 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
a8d0: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66  3_os_type = sInf
a8e0: 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d  o.dwPlatformId==
a8f0: 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e  VER_PLATFORM_WIN
a900: 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20  32_NT ? 2 : 1;. 
a910: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
a920: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
a930: 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  =2;.  }.#endif..
a940: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
a950: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
a960: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
a970: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
a980: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
a990: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
a9a0: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
a9b0: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
a9c0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
a9d0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
a9e0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
a9f0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
aa00: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
aa10: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
aa20: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
aa30: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
aa40: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
aa50: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
aa60: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
aa70: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
aa80: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
aa90: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
aaa0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
aab0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
aac0: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
aad0: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
aae0: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
aaf0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
ab00: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
ab10: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
ab20: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
ab30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
ab40: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
ab50: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  oc %u bytes (%lu
ab60: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
ab80: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
ab90: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
aba0: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
abb0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
abc0: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
abd0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
abe0: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
abf0: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
ac00: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
ac10: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
ac20: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
ac30: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
ac40: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
ac50: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
ac60: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
ac70: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
ac80: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
ac90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
aca0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
acb0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
acc0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
acd0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
ace0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
acf0: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
ad00: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
ad10: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
ad20: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
ad30: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
ad40: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
ad50: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
ad60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
ad70: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
ad80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
ad90: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
ada0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
adb0: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ree block %p (%l
adc0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
ade0: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
adf0: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
ae00: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
ae10: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
ae20: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
ae30: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
ae40: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
ae50: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
ae60: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
ae70: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
ae80: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
ae90: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
aea0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
aeb0: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
aec0: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
aed0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
aee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
aef0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
af00: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
af10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
af20: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
af30: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
af40: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
af50: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
af60: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
af70: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
af80: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
af90: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
afa0: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
afb0: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
afc0: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
afd0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
afe0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
aff0: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
b000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
b010: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
b020: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b030: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b040: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
b050: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
b060: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
b070: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b080: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
b090: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
b0a0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b0c0: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
b0d0: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
b0e0: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
b0f0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b110: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b120: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b130: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b140: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
b150: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
b160: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
b170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
b180: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
b190: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b1a0: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
b1b0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
b1c0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
b1d0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
b1e0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
b1f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b200: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
b210: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
b220: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b230: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
b240: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
b250: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
b260: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
b270: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
b280: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b290: 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e  FLAGS, p) );.#en
b2a0: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
b2b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
b2c0: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
b2d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b2e0: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
b2f0: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
b300: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
b310: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b320: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
b330: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
b340: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
b350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b360: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
b370: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
b380: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
b390: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b3a0: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
b3b0: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
b3c0: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
b3d0: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
b3e0: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
b3f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
b400: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
b410: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
b420: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b430: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
b440: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
b450: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
b460: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
b470: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
b480: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
b490: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
b4a0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
b4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
b4c0: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
b4d0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
b4e0: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
b4f0: 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C1 );.  assert( 
b500: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
b510: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
b520: 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  C2 );..#if !SQLI
b530: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
b540: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b550: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
b560: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b570: 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64  p ){.    DWORD d
b580: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53  wInitialSize = S
b590: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b5a0: 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20  _INIT_SIZE;.    
b5b0: 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53  DWORD dwMaximumS
b5c0: 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c  ize = (DWORD)sql
b5d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
b5e0: 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20  .nHeap;.    if( 
b5f0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30  dwMaximumSize==0
b600: 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69   ){.      dwMaxi
b610: 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  mumSize = SQLITE
b620: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
b630: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  SIZE;.    }else 
b640: 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  if( dwInitialSiz
b650: 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  e>dwMaximumSize 
b660: 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69  ){.      dwIniti
b670: 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d  alSize = dwMaxim
b680: 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  umSize;.    }.  
b690: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
b6a0: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
b6b0: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
b6c0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
b700: 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29  , dwMaximumSize)
b710: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
b720: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
b730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
b740: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
b750: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
b760: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
b770: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75   (%lu), flags=%u
b780: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20  , initSize=%lu, 
b790: 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20  maxSize=%lu",.  
b7a0: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
b7b0: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
b7c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b7d0: 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  S, dwInitialSize
b7e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d 61  ,.          dwMa
b7f0: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
b800: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b810: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
b820: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
b830: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
b840: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b850: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
b860: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
b870: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
b880: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
b890: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
b8a0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
b8b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b8c0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
b8d0: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
b8e0: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
b8f0: 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c  p (%lu)", osGetL
b900: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
b910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b920: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
b930: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
b940: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
b950: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
b960: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
b970: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
b980: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
b990: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
b9a0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b9b0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
b9c0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
b9d0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b9e0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b9f0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
ba00: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
ba10: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
ba20: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
ba30: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
ba40: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
ba50: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
ba60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ba70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
ba80: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
ba90: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
baa0: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
bab0: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
bac0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
bad0: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
bae0: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
baf0: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
bb00: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
bb10: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
bb20: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
bb30: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
bb40: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
bb50: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
bb60: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
bb70: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
bb80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bb90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bba0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bbb0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
bbc0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
bbd0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
bbe0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
bbf0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
bc00: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
bc10: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
bc20: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
bc30: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
bc40: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
bc50: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
bc60: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
bc70: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
bc80: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
bc90: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
bca0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
bcb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bcc0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
bcd0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
bce0: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
bcf0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
bd10: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
bd20: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
bd30: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
bd40: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
bd50: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
bd60: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
bd70: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
bd80: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
bd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
bda0: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
bdb0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
bdc0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
bdd0: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
bde0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
bdf0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
be00: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
be10: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
be20: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
be30: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
be40: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
be50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
be60: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
be70: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
be80: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
be90: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
bea0: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
beb0: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
bec0: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
bed0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
bee0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
bef0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
bf00: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
bf10: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
bf20: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
bf30: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
bf40: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
bf50: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
bf60: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
bf70: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
bf80: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
bf90: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
bfa0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
bfb0: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
bfc0: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
bfd0: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
bfe0: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
bff0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
c000: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
c010: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
c020: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
c030: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
c040: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
c050: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
c060: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
c070: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
c080: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
c090: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
c0a0: 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70  -16?). .**.** Sp
c0b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
c0c0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
c0d0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
c0e0: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
c0f0: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66  ic LPWSTR winUtf
c100: 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
c110: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
c120: 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
c130: 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
c140: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
c150: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
c160: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
c170: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
c180: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
c190: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
c1a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c1b0: 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  }.  zWideFilenam
c1c0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
c1d0: 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a  cZero( nChar*siz
c1e0: 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  eof(zWideFilenam
c1f0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
c200: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  WideFilename==0 
c210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c220: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f  .  }.  nChar = o
c230: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
c240: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
c250: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
c260: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20  zWideFilename,. 
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
c290: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
c2a0: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
c2b0: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46  ite3_free(zWideF
c2c0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57  ilename);.    zW
c2d0: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ideFilename = 0;
c2e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
c2f0: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ideFilename;.}..
c300: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
c310: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
c320: 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
c330: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
c340: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a  urned string is.
c350: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
c360: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
c370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
c380: 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55  r *winUnicodeToU
c390: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
c3a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
c3b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
c3c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  *zFilename;..  n
c3d0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
c3e0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
c3f0: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
c400: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
c410: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
c420: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
c430: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c440: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
c450: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
c460: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
c470: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
c480: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c490: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
c4a0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
c4b0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
c4c0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
c4d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65  zFilename, nByte
c4e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e    0, 0);.  if( n
c510: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
c520: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
c530: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
c540: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
c550: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
c560: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
c570: 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74  nvert an ANSI st
c580: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
c590: 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64  t Unicode, based
c5a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
c5b0: 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74  nt codepage sett
c5c0: 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70  ings for file ap
c5d0: 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65  is..** .** Space
c5e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
c5f0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
c600: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
c610: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e   sqlite3_malloc.
c620: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
c630: 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f  R winMbcsToUnico
c640: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
c650: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
c660: 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52   nByte;.  LPWSTR
c670: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
c680: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
c690: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
c6a0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
c6b0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
c6c0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
c6d0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
c6e0: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
c6f0: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20  e, -1, NULL,.   
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a               0)*
c720: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20  sizeof(WCHAR);. 
c730: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
c740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c750: 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61   }.  zMbcsFilena
c760: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
c770: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
c780: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
c790: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
c7a0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
c7b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c7c0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
c7d0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
c7e0: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
c7f0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
c800: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
c810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
c840: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
c850: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
c860: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
c870: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
c880: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c890: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
c8a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
c8b0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
c8c0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
c8d0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
c8e0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
c8f0: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
c900: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
c910: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
c920: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
c930: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
c940: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
c950: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
c960: 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65  char *winUnicode
c970: 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a  ToMbcs(LPCWSTR z
c980: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
c990: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
c9a0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
c9b0: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
c9c0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
c9d0: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
c9e0: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
c9f0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
ca00: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
ca10: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
ca20: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
ca30: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
ca40: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72  te == 0 ){.    r
ca50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
ca60: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
ca70: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
ca80: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69  yte );.  if( zFi
ca90: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
caa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cab0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
cac0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
cad0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
cae0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
caf0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c            nByte,
cb20: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cb30: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cb40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
cb50: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
cb60: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
cb70: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
cb80: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
cb90: 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63  vert multibyte c
cba0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
cbb0: 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
cbc0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
cbd0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
cbe0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
cbf0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cc00: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  )..*/.char *sqli
cc10: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
cc20: 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61  o_utf8(const cha
cc30: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
cc40: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cc50: 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Utf8;.  LPWSTR z
cc60: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
cc70: 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f  Wide = winMbcsTo
cc80: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
cc90: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
cca0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
ccb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
ccc0: 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e  lenameUtf8 = win
ccd0: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
cce0: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
ccf0: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
cd00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
cd10: 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a  enameUtf8;.}../*
cd20: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d  .** Convert UTF-
cd30: 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63  8 to multibyte c
cd40: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e  haracter string.
cd50: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
cd60: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
cd70: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
cd80: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
cd90: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
cda0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
cdb0: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
cdc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
cdd0: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
cde0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
cdf0: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
ce00: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77  ..  zTmpWide = w
ce10: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
ce20: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
ce30: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
ce40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ce50: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62   }.  zFilenameMb
ce60: 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  cs = winUnicodeT
ce70: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
ce80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ce90: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
cea0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  urn zFilenameMbc
ceb0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
cec0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
ced0: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
cee0: 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61  y or the tempora
cef0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61 73  ry directory bas
cf00: 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f  ed on.** the pro
cf10: 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e  vided arguments.
cf20: 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75 6d    The type argum
cf30: 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e  ent must be 1 in
cf40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
cf50: 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74  e.** data direct
cf60: 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65  ory or 2 in orde
cf70: 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d  r to set the tem
cf80: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
cf90: 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a  .  The zValue.**
cfa0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
cfb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
cfc0: 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20  ectory to use.  
cfd0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
cfe0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49   will be.** SQLI
cff0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
d000: 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ful..*/.int sqli
d010: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
d020: 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79  rectory(DWORD ty
d030: 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c  pe, LPCWSTR zVal
d040: 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70  ue){.  char **pp
d050: 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23  Directory = 0;.#
d060: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d070: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e  IT_AUTOINIT.  in
d080: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69  t rc = sqlite3_i
d090: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
d0a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d0b0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  c;.#endif.  if( 
d0c0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
d0d0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
d0e0: 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70  Y_TYPE ){.    pp
d0f0: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c  Directory = &sql
d100: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
d110: 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ory;.  }else if(
d120: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d130: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
d140: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
d150: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
d160: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
d170: 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65  tory;.  }.  asse
d180: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
d190: 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45   || type==SQLITE
d1a0: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
d1b0: 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20  CTORY_TYPE.     
d1c0: 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51       || type==SQ
d1d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
d1e0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
d1f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
d200: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71  pDirectory || sq
d210: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
d220: 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72  Type(*ppDirector
d230: 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  y, MEMTYPE_HEAP)
d240: 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65   );.  if( ppDire
d250: 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61  ctory ){.    cha
d260: 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20  r *zValueUtf8 = 
d270: 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75  0;.    if( zValu
d280: 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29  e && zValue[0] )
d290: 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74  {.      zValueUt
d2a0: 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  f8 = winUnicodeT
d2b0: 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20  oUtf8(zValue);. 
d2c0: 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65       if ( zValue
d2d0: 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Utf8==0 ){.     
d2e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d2f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
d300: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d310: 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63 74  3_free(*ppDirect
d320: 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72  ory);.    *ppDir
d330: 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55  ectory = zValueU
d340: 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tf8;.    return 
d350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d360: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d370: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
d380: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
d390: 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  of winGetLastErr
d3a0: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
d3b0: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
d3c0: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
d3d0: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
d3e0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
d3f0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
d400: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
d410: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
d420: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
d430: 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72  Msg(DWORD lastEr
d440: 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  rno, int nBuf, c
d450: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
d460: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72   FormatMessage r
d470: 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c  eturns 0 on fail
d480: 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ure.  Otherwise 
d490: 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  it.  ** returns 
d4a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43  the number of TC
d4b0: 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20  HARs written to 
d4c0: 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20  the output.  ** 
d4d0: 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e  buffer, excludin
d4e0: 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e  g the terminatin
d4f0: 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a  g null char..  *
d500: 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20  /.  DWORD dwLen 
d510: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  = 0;.  char *zOu
d520: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73  t = 0;..  if( os
d530: 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
d540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
d550: 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64    WCHAR zTempWid
d560: 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e[SQLITE_WIN32_M
d570: 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b  AX_ERRMSG_CHARS+
d580: 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  1];.    dwLen = 
d590: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
d5a0: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
d5b0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
d5e0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
d5f0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
d640: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
d6b0: 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53  _WIN32_MAX_ERRMS
d6c0: 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20  G_CHARS,.       
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6e0: 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a        0);.#else.
d6f0: 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
d700: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
d710: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
d720: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
d730: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
d740: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
d770: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
d780: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
d7b0: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
d7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
d7e0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52           (LPWSTR
d850: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
d8a0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77  endif.    if( dw
d8b0: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
d8c0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
d8d0: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
d8e0: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
d8f0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d900: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d910: 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55       zOut = winU
d920: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
d930: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73  mpWide);.      s
d940: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
d950: 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51  alloc();.#if !SQ
d960: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
d970: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
d980: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
d990: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
d9a0: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
d9b0: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
d9c0: 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66  empWide);.#endif
d9d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
d9e0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
d9f0: 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
da00: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
da10: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
da20: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
da30: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
da40: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
da50: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
da80: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
dab0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
dac0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
db10: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65      (LPSTR) &zTe
db60: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
dbb0: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
dbc0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
dbd0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
dbe0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
dbf0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
dc00: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
dc10: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
dc20: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
dc30: 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
dc40: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
dc50: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
dc60: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
dc70: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
dc80: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
dc90: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
dca0: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
dcb0: 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  emp);.    }.  }.
dcc0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d  #endif.  if( 0 =
dcd0: 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73  = dwLen ){.    s
dce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
dcf0: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45  nBuf, zBuf, "OsE
dd00: 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c 75 29  rror 0x%lx (%lu)
dd10: 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61  ", lastErrno, la
dd20: 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73  stErrno);.  }els
dd30: 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61  e{.    /* copy a
dd40: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66   maximum of nBuf
dd50: 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74   chars to output
dd60: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
dd70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
dd80: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22  nBuf, zBuf, "%s"
dd90: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  , zOut);.    /* 
dda0: 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75  free the UTF8 bu
ddb0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
ddc0: 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
ddd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
dde0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  }../*.**.** This
ddf0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c   function - winL
de00: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20  ogErrorAtLine() 
de10: 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  - is only ever c
de20: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
de30: 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72  cro.** winLogErr
de40: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  or()..**.** This
de50: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
de60: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
de70: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
de80: 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  OS function..** 
de90: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
dea0: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
deb0: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
dec0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
ded0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63  ue of.** error c
dee0: 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  ode and, if poss
def0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
df00: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
df10: 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72  ent from .** For
df20: 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  matMessage..**.*
df30: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
df40: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
df50: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
df60: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
df70: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
df80: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
df90: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
dfa0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
dfb0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
dfc0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
dfd0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
dfe0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
dff0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
e000: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
e010: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
e020: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
e030: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
e040: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
e050: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
e060: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
e070: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
e080: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
e090: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
e0a0: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
e0b0: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
e0d0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
e0e0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
e0f0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
e100: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
e110: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
e120: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e140: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
e150: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
e160: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e170: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
e180: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
e190: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
e1a0: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
e1b0: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1d0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
e1e0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
e1f0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
e200: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
e230: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
e240: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e270: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
e280: 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61   = 0;.  winGetLa
e290: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45  stErrorMsg(lastE
e2a0: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  rrno, sizeof(zMs
e2b0: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73  g), zMsg);.  ass
e2c0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
e2d0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
e2e0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
e2f0: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d  h = "";.  for(i=
e300: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
e310: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a  sg[i]!='\r' && z
e320: 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  Msg[i]!='\n'; i+
e330: 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d  +){}.  zMsg[i] =
e340: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   0;.  sqlite3_lo
e350: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
e360: 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28   "os_win.c:%d: (
e370: 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73  %lu) %s(%s) - %s
e380: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
e390: 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
e3a0: 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
e3b0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
e3c0: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
e3d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
e3e0: 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
e3f0: 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
e400: 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
e410: 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
e420: 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
e430: 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
e440: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
e450: 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69  ed by .** antivi
e460: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
e470: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
e480: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
e490: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
e4a0: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
e4b0: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
e4c0: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
e4d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e4e0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
e4f0: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
e500: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e510: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
e520: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
e530: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
e540: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
e550: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e560: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
e570: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
e580: 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79  nt winIoerrRetry
e590: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
e5a0: 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61  IOERR_RETRY;.sta
e5b0: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
e5c0: 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
e5d0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e5e0: 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
e5f0: 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c  .** If a ReadFil
e600: 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65  e() or WriteFile
e610: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
e620: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
e630: 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69  tine.** to see i
e640: 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72  f it should be r
e650: 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20  etried.  Return 
e660: 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20  TRUE to retry.  
e670: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
e680: 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20  to give up with 
e690: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
e6a0: 74 69 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79  tic int winRetry
e6b0: 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74  Ioerr(int *pnRet
e6c0: 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f  ry, DWORD *pErro
e6d0: 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20  r){.  DWORD e = 
e6e0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
e6f0: 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79  ;.  if( *pnRetry
e700: 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20  >=winIoerrRetry 
e710: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f  ){.    if( pErro
e720: 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72  r ){.      *pErr
e730: 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20  or = e;.    }.  
e740: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e750: 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41    if( e==ERROR_A
e760: 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a  CCESS_DENIED ||.
e770: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c        e==ERROR_L
e780: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c  OCK_VIOLATION ||
e790: 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f  .      e==ERROR_
e7a0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
e7b0: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
e7c0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
e7d0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
e7e0: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
e7f0: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
e800: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
e810: 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b  .  if( pError ){
e820: 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65  .    *pError = e
e830: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
e840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61  ;.}../*.** Log a
e850: 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79   I/O error retry
e860: 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61   episode..*/.sta
e870: 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49  tic void winLogI
e880: 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29  oerr(int nRetry)
e890: 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20 29  {.  if( nRetry )
e8a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
e8b0: 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  g(SQLITE_IOERR, 
e8c0: 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64 20  .      "delayed 
e8d0: 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68  %dms for lock/sh
e8e0: 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c  aring conflict",
e8f0: 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52  .      winIoerrR
e900: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
e910: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
e920: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
e930: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
e940: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
e990: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
e9a0: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
e9b0: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  CE only..*/.#if 
e9c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e9d0: 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41  MSVC_LOCALTIME_A
e9e0: 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d  PI) || !SQLITE_M
e9f0: 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
ea00: 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43  I./*.** The MSVC
ea10: 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20   CRT on Windows 
ea20: 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CE may not have 
ea30: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
ea40: 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63  nction.  So.** c
ea50: 72 65 61 74 65 20 61 20 73 75 62 73 74 69 74 75  reate a substitu
ea60: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
ea70: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
ea80: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
ea90: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
eaa0: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
eab0: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
eac0: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
ead0: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
eae0: 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
eaf0: 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
eb00: 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
eb10: 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
eb20: 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
eb30: 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
eb40: 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
eb50: 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
eb60: 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
eb70: 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
eb80: 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
eb90: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
eba0: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
ebb0: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
ebc0: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
ebd0: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
ebe0: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
ebf0: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
ec00: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
ec10: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
ec20: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
ec30: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
ec40: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
ec50: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
ec60: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
ec70: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
ec80: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
ec90: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
eca0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  ;.}.#endif..#def
ecb0: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
ecc0: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
ecd0: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
ece0: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
ecf0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
ed00: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
ed10: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
ed20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ed30: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ed40: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
ed50: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
ed60: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
ed70: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
ed80: 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
ed90: 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
eda0: 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
edb0: 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
edc0: 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
edd0: 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
ede0: 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
edf0: 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
ee00: 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
ee10: 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
ee20: 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
ee30: 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
ee40: 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
ee50: 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
ee60: 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
ee70: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
ee80: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
ee90: 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
eea0: 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74 65   int winceCreate
eeb0: 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  Lock(const char 
eec0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46  *zFilename, winF
eed0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c  ile *pFile){.  L
eee0: 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50  PWSTR zTok;.  LP
eef0: 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57  WSTR zName;.  DW
ef00: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
ef10: 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20   BOOL bLogged = 
ef20: 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49  FALSE;.  BOOL bI
ef30: 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a  nit = TRUE;..  z
ef40: 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54 6f  Name = winUtf8To
ef50: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
ef60: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
ef70: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74  =0 ){.    /* out
ef80: 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
ef90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
efa0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
efb0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
efc0: 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
efd0: 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  data */.  memset
efe0: 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20  (&pFile->local, 
eff0: 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d  0, sizeof(pFile-
f000: 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20  >local));..  /* 
f010: 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b  Replace the back
f020: 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65  slashes from the
f030: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f   filename and lo
f040: 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20  wercase it.  ** 
f050: 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74 65  to derive a mute
f060: 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f  x name. */.  zTo
f070: 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 57  k = osCharLowerW
f080: 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28  (zName);.  for (
f090: 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a  ;*zTok;zTok++){.
f0a0: 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d      if (*zTok ==
f0b0: 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27   '\\') *zTok = '
f0c0: 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72  _';.  }..  /* Cr
f0d0: 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61  eate/open the na
f0e0: 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70  med mutex */.  p
f0f0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f  File->hMutex = o
f100: 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55  sCreateMutexW(NU
f110: 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65  LL, FALSE, zName
f120: 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  );.  if (!pFile-
f130: 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46  >hMutex){.    pF
f140: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f150: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
f160: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f170: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
f180: 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
f190: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
f1a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f1b0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
f1c0: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
f1d0: 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46  CreateLock1", zF
f1e0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  ilename);.  }.. 
f1f0: 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
f200: 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e  mutex before con
f210: 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  tinuing */.  win
f220: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
f230: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
f240: 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65   .  /* Since the
f250: 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20   names of named 
f260: 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f  mutexes, semapho
f270: 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e  res, file mappin
f280: 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a  gs etc are .  **
f290: 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c   case-sensitive,
f2a0: 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
f2b0: 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72  of that by upper
f2c0: 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  casing the mutex
f2d0: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75   name.  ** and u
f2e0: 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65  sing that as the
f2f0: 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70   shared filemapp
f300: 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  ing name..  */. 
f310: 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e   osCharUpperW(zN
f320: 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  ame);.  pFile->h
f330: 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74  Shared = osCreat
f340: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e  eFileMappingW(IN
f350: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
f360: 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  UE, NULL,.      
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
f3a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
f3b0: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3e0: 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20  zName);  ..  /* 
f3f0: 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20  Set a flag that 
f400: 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20  indicates we're 
f410: 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65  the first to cre
f420: 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ate the memory s
f430: 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20  o it .  ** must 
f440: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
f450: 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
f460: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
f470: 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
f480: 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
f490: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
f4a0: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
f4b0: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
f4c0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
f4d0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
f4e0: 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
f4f0: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
f500: 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
f510: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
f520: 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
f530: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
f540: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
f550: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
f560: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
f570: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
f580: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
f590: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
f5a0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
f5b0: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
f5c0: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
f5d0: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
f5e0: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
f5f0: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
f600: 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72  if( !pFile->shar
f610: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
f620: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
f630: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
f640: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
f650: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
f660: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f670: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
f680: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
f690: 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
f6a0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
f6b0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
f6c0: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
f6d0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
f6e0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
f6f0: 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
f700: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f710: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
f720: 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
f730: 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
f740: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
f750: 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  l */.  if( pFile
f760: 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20  ->hShared==NULL 
f770: 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67  ){.    if( !bLog
f780: 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ged ){.      pFi
f790: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f7a0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
f7b0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f7c0: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
f7d0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f7f0: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33  winceCreateLock3
f800: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
f810: 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
f820: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  RUE;.    }.    w
f830: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
f840: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
f850: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
f860: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
f870: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
f880: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
f890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
f8a0: 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  OERR;.  }.  .  /
f8b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f8c0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
f8d0: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
f8e0: 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e   to */.  if( bIn
f8f0: 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it ){.    memset
f900: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
f910: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
f920: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
f930: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
f940: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
f950: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f960: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  OK;.}../*.** Des
f970: 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66  troy the part of
f980: 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65   winFile that de
f990: 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c  als with wince l
f9a0: 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ocks.*/.static v
f9b0: 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79  oid winceDestroy
f9c0: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
f9d0: 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c  ile){.  if (pFil
f9e0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
f9f0: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
fa00: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
fa10: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
fa20: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
fa30: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
fa40: 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c  ing blocks shoul
fa50: 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72  d probably asser
fa60: 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  t in debug mode,
fa70: 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20   but they.      
fa80: 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20   are to cleanup 
fa90: 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b  in case any lock
faa0: 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20  s remained open 
fab0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
fac0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
fad0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
fae0: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
faf0: 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   --;.    }.    i
fb00: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
fb10: 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20  bReserved){.    
fb20: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
fb30: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
fb40: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
fb50: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
fb60: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
fb70: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
fb80: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
fb90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
fba0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
fbb0: 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70  lusive){.      p
fbc0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
fbd0: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
fbe0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fbf0: 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64  De-reference and
fc00: 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20   close our copy 
fc10: 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  of the shared me
fc20: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  mory handle */. 
fc30: 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66     osUnmapViewOf
fc40: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
fc50: 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ed);.    osClose
fc60: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
fc70: 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  hared);..    /* 
fc80: 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75  Done with the mu
fc90: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
fca0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
fcb0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20  le->hMutex);    
fcc0: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
fcd0: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
fce0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
fcf0: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
fd00: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d  .}../* .** An im
fd10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
fd20: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
fd30: 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
fd40: 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
fd50: 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  OOL winceLockFil
fd60: 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
fd70: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
fd80: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
fd90: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
fda0: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
fdb0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
fdc0: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
fdd0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
fde0: 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  ToLockHigh.){.  
fdf0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
fe00: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
fe10: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
fe20: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
fe30: 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  SE;..  UNUSED_PA
fe40: 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66  RAMETER(dwFileOf
fe50: 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55  fsetHigh);.  UNU
fe60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
fe70: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
fe80: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
fe90: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
fea0: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
feb0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
fec0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
fed0: 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61  ..  /* Wanting a
fee0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
fef0: 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  ? */.  if (dwFil
ff00: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
ff10: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
ff20: 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d  T.       && nNum
ff30: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
ff40: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
ff50: 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20  ARED_SIZE){.    
ff60: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
ff70: 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  d->nReaders == 0
ff80: 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65   && pFile->share
ff90: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
ffa0: 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c   0){.       pFil
ffb0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
ffc0: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
ffd0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
ffe0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  l.bExclusive = T
fff0: 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74  RUE;.       bRet
10000 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10010 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10020 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63   a read-only loc
10030 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
10040 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
10050 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
10060 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20  D_FIRST &&.     
10070 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42        nNumberOfB
10080 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
10090 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
100a0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
100b0 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
100c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
100d0 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20  .nReaders ++;.  
100e0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
100f0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
10100 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69   1){.        pFi
10110 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
10120 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d  ders ++;.      }
10130 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
10140 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
10150 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65  ..  /* Want a pe
10160 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  nding lock? */. 
10170 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
10180 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10190 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
101a0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
101b0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
101c0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
101d0 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69    /* If no pendi
101e0 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ng lock has been
101f0 20 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20   acquired, then 
10200 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20  acquire it */.  
10210 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
10220 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d  red->bPending ==
10230 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
10240 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
10250 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
10260 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
10270 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
10280 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10290 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
102a0 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73  .  /* Want a res
102b0 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  erved lock? */. 
102c0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
102d0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
102e0 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
102f0 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
10300 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10310 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
10320 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
10330 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
10340 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
10350 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
10360 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
10370 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
10380 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52  l.bReserved = TR
10390 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
103a0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
103b0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
103c0 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
103d0 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
103e0 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n bReturn;.}../*
103f0 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
10400 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c  ation of the Unl
10410 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57  ockFile API of W
10420 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
10430 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
10440 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  ceUnlockFile(.  
10450 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
10460 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
10470 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
10480 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
10490 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
104a0 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
104b0 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
104c0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
104d0 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
104e0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
104f0 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
10500 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
10510 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
10520 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
10530 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
10540 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
10550 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
10560 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10570 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
10580 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
10590 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
105a0 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
105b0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
105c0 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
105d0 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
105e0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
105f0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
10600 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
10610 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
10620 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
10630 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
10640 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
10650 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10660 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
10670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
10680 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
10690 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
106a0 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
106b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
106c0 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
106d0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
106e0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
106f0 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
10700 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
10710 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
10720 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
10730 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
10740 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
10750 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10760 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
10770 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
10780 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
10790 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
107a0 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20  ARED_SIZE.      
107b0 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65         || nNumbe
107c0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
107d0 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
107e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
107f0 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
10800 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10810 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
10820 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
10830 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10840 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
10850 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
10860 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
10870 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
10880 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
10890 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
108a0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
108b0 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
108c0 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
108d0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
108e0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
108f0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
10900 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
10910 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
10920 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
10930 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
10940 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10950 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
10960 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
10970 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
10980 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69    }.  /* Releasi
10990 6e 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ng a reserved lo
109a0 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
109b0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
109c0 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
109d0 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
109e0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
109f0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
10a00 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
10a10 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10a20 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
10a30 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10a40 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
10a50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10a60 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
10a70 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
10a80 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10a90 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
10aa0 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
10ab0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
10ac0 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
10ad0 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ./*.** End of th
10ae0 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66  e special code f
10af0 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a  or wince.*******
10b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b40 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
10b50 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  * SQLITE_OS_WINC
10b60 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  E */../*.** Lock
10b70 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
10b80 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
10b90 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  inLockFile(.  LP
10ba0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
10bb0 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20   DWORD flags,.  
10bc0 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
10bd0 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
10be0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
10bf0 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
10c00 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
10c10 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
10c20 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
10c30 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
10c40 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
10c50 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
10c60 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
10c70 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
10c80 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a    API LockFile..
10c90 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
10ca0 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
10cb0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
10cc0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
10cf0 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
10d00 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
10d10 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
10d20 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
10d30 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
10d40 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
10d50 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
10d60 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
10d70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
10d80 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
10d90 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
10da0 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  sLockFileEx(*phF
10db0 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e  ile, flags, 0, n
10dc0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
10dd0 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29  ytesHigh, &ovlp)
10de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
10df0 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
10e00 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
10e10 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
10e20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
10e50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
10e60 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20  ./*.** Unlock a 
10e70 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f  file region.. */
10e80 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
10e90 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
10ea0 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
10eb0 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77   DWORD offsetLow
10ec0 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
10ed0 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75  High,.  DWORD nu
10ee0 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f  mBytesLow,.  DWO
10ef0 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a  RD numBytesHigh.
10f00 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
10f10 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  _WINCE.  /*.  **
10f20 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
10f30 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
10f40 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
10f50 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
10f60 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20  e Win32.  **    
10f70 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c     API UnlockFil
10f80 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
10f90 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
10fa0 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
10fb0 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
10fe0 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
10ff0 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
11000 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
11010 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
11020 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
11030 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
11040 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
11050 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
11060 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
11070 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
11080 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
11090 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69  eturn osUnlockFi
110a0 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c  leEx(*phFile, 0,
110b0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
110c0 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
110d0 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
110e0 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
110f0 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
11100 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
11110 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
11120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11130 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11140 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
11150 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  dif.}../********
11160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111a0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
111b0 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
111c0 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
111d0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
111e0 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
111f0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
11200 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
11210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
11260 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
11270 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
11280 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
11290 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
112a0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
112b0 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
112c0 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
112d0 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
112e0 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
112f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
11300 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
11310 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
11320 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
11330 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
11340 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73   to offset iOffs
11350 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  et within the fi
11360 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
11370 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a  l, return 0. .**
11380 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
11390 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
113a0 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
113b0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
113c0 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  int winSeekFile(
113d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
113e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
113f0 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c  ffset){.#if !SQL
11400 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c  ITE_OS_WINRT.  L
11410 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11430 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
11440 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
11450 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
11460 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
11470 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
11480 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
11490 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
114a0 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
114d0 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
114e0 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44  ter() */.  DWORD
114f0 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
11500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
11510 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11520 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
11530 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  /..  OSTRACE(("S
11540 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66  EEK file=%p, off
11550 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69  set=%lld\n", pFi
11560 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29  le->h, iOffset))
11570 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d  ;..  upperBits =
11580 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74   (LONG)((iOffset
11590 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
115a0 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  ff);.  lowerBits
115b0 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65   = (LONG)(iOffse
115c0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
115d0 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74  ..  /* API oddit
115e0 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  y: If successful
115f0 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  , SetFilePointer
11600 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f  () returns a dwo
11610 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  rd .  ** contain
11620 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
11630 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
11640 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
11650 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
11660 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
11670 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
11680 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
11690 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
116a0 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49  DN, .  ** INVALI
116b0 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
116c0 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61  ER may also be a
116d0 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65   valid new offse
116e0 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69  t. So to determi
116f0 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
11700 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63   an error has ac
11710 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c  tually occurred,
11720 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
11730 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20  ssary to call . 
11740 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
11750 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
11760 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
11770 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
11780 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
11790 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
117a0 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
117b0 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
117c0 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
117d0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
117e0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
117f0 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
11800 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
11810 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
11820 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
11830 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
11840 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
11850 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
11860 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
11870 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
11880 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
11890 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
118a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
118b0 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
118c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
118d0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
118e0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
118f0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
11900 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
11910 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
11920 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
11930 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
11940 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
11950 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
11960 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
11970 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
11980 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
11990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
119a0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
119b0 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
119d0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
119e0 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
119f0 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
11a00 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
11a10 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
11a20 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
11a30 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
11a40 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
11a50 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
11a60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
11a70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
11a80 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
11a90 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
11aa0 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
11ab0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11ac0 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
11ad0 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
11ae0 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
11af0 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
11b00 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
11b10 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
11b20 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
11b30 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
11b40 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
11b50 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
11b60 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
11b70 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
11b80 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
11b90 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
11ba0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
11bb0 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
11bc0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
11bd0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70   for memory mapp
11be0 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ed files */.stat
11bf0 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c  ic int winMapfil
11c00 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69  e(winFile*, sqli
11c10 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74  te3_int64);.stat
11c20 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
11c30 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23  ile(winFile*);.#
11c40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
11c50 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
11c60 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
11c70 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
11c80 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
11c90 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
11ca0 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
11cb0 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
11cc0 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
11cd0 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e  but Windows is n
11ce0 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
11cf0 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
11d00 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
11d10 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
11d20 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
11d30 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
11d40 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
11d50 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
11d60 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
11d70 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
11d80 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
11d90 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
11da0 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
11db0 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
11dc0 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
11dd0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
11de0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
11df0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
11e00 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
11e10 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
11e20 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
11e30 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
11e40 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
11e50 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
11e60 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23  sert( id!=0 );.#
11e70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11e80 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28  IT_WAL.  assert(
11e90 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20   pFile->pShm==0 
11ea0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
11eb0 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55  rt( pFile->h!=NU
11ec0 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d  LL && pFile->h!=
11ed0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
11ee0 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43  ALUE );.  OSTRAC
11ef0 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
11f00 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  p\n", pFile->h))
11f10 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
11f20 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11f30 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
11f40 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
11f50 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
11f60 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
11f70 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
11f80 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
11f90 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
11fa0 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
11fb0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
11fc0 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
11fd0 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
11fe0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
11ff0 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
12000 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12010 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
12020 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
12030 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
12040 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
12050 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
12060 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
12070 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
12080 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
12090 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
120a0 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
120b0 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
120c0 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
120d0 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
120e0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
120f0 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
12100 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74   .        && cnt
12110 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54  ++ < WINCE_DELET
12120 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20  ION_ATTEMPTS.   
12130 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
12140 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
12150 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
12160 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
12170 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
12180 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
12190 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
121a0 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
121b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
121c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68   ){.    pFile->h
121d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
121e0 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
121f0 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
12200 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  E file=%p, rc=%s
12210 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12220 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
12230 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
12240 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  rc ? SQLITE_OK. 
12250 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e             : win
12260 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
12270 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47  IOERR_CLOSE, osG
12280 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f           "winClo
122b0 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  se", pFile->zPat
122c0 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  h);.}../*.** Rea
122d0 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
122e0 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
122f0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
12300 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
12310 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
12320 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
12330 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
12340 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
12350 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
12360 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20   int winRead(.  
12370 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12380 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
12390 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
123a0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74  /* Write content
123d0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
123e0 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  r */.  int amt, 
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
12410 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
12420 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12430 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20  offset       /* 
12440 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74  Begin reading at
12450 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a   this offset */.
12460 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
12470 53 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41  S_WINCE.  OVERLA
12480 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
12490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
124a0 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64   offset for Read
124b0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
124c0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
124d0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
124e0 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65    /* file handle
124f0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61   */.  DWORD nRea
12500 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
12510 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12520 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
12530 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65  y read from file
12540 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
12550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12560 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12570 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20  of retrys */..  
12580 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12590 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
125a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
125b0 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d  fset>=0 );.  Sim
125c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
125d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
125e0 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
125f0 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
12600 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
12610 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  unt=%d, offset=%
12620 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
12630 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
12640 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
12650 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e   offset, pFile->
12660 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
12670 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
12680 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
12690 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
126a0 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
126b0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
126c0 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
126d0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
126e0 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
126f0 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
12700 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
12710 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
12720 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
12730 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
12740 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
12750 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
12760 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
12770 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
12780 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
12790 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
127a0 44 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20  D-MMAP file=%p, 
127b0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
127c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
127d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
127e0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
127f0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
12800 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
12810 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
12820 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
12830 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
12840 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
12850 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
12860 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
12870 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
12880 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
12890 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
128a0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
128b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
128c0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
128d0 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 77 69  S_WINCE.  if( wi
128e0 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
128f0 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
12900 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
12910 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
12920 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65  E_FULL\n", pFile
12930 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12940 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
12950 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
12960 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
12970 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
12980 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ead, 0) ){.#else
12990 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c  .  memset(&overl
129a0 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
129b0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
129c0 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
129d0 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
129e0 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
129f0 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
12a00 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
12a10 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
12a20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
12a30 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
12a40 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
12a50 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
12a60 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
12a70 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c  .         osGetL
12a80 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
12a90 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a  R_HANDLE_EOF ){.
12aa0 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44  #endif.    DWORD
12ab0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
12ac0 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
12ad0 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
12ae0 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
12af0 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
12b00 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
12b10 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
12b20 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
12b30 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
12b40 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  _READ\n", pFile-
12b50 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
12b60 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12b70 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
12b80 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12b90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12ba0 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61           "winRea
12bb0 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
12bc0 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49  );.  }.  winLogI
12bd0 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
12be0 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44  if( nRead<(DWORD
12bf0 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55  )amt ){.    /* U
12c00 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
12c10 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
12c20 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
12c30 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
12c40 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64  har*)pBuf)[nRead
12c50 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29  ], 0, amt-nRead)
12c60 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
12c70 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
12c80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
12c90 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69  ORT_READ\n", pFi
12ca0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
12cb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
12cc0 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
12cd0 0a 0a 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 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
12d00 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
12d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12d20 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
12d30 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
12d40 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
12d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
12d60 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
12d70 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
12d80 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
12d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12da0 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  inWrite(.  sqlit
12db0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
12dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
12dd0 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  le to write into
12de0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
12df0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
12e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
12e10 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  es to be written
12e20 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12e50 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74  of bytes to writ
12e60 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
12e70 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
12e80 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
12e90 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74   into the file t
12ea0 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
12eb0 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  at */.){.  int r
12ec0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
12ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12ee0 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20  ue if error has 
12ef0 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66  occurred, else f
12f00 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  alse */.  winFil
12f10 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
12f20 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
12f30 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
12f40 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12f60 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69   Number of retri
12f70 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
12f80 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
12f90 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
12fa0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
12fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12fc0 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
12fd0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
12fe0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
12ff0 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
13000 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
13010 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61  %p, buffer=%p, a
13020 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74  mount=%d, offset
13030 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
13040 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
13050 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
13060 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
13070 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
13080 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
13090 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
130a0 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
130b0 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
130c0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
130d0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
130e0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
130f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
13100 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
13110 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
13120 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
13130 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
13140 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
13150 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
13160 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
13170 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
13180 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
13190 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
131a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
131b0 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d  WRITE-MMAP file=
131c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
131d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
131e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
131f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
13200 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
13210 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
13220 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
13230 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
13240 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
13250 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
13260 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
13270 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
13280 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
13290 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
132a0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
132b0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
132c0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
132d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
132e0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63  TE_OS_WINCE.  rc
132f0 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70   = winSeekFile(p
13300 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
13310 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65   if( rc==0 ){.#e
13320 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23  lse.  {.#endif.#
13330 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
13340 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50  NCE.    OVERLAPP
13350 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20  ED overlapped;  
13360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
13370 73 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c  set for WriteFil
13380 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  e. */.#endif.   
13390 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20   u8 *aRem = (u8 
133a0 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f  *)pBuf;        /
133b0 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65  * Data yet to be
133c0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
133d0 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20  int nRem = amt; 
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
133f0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
13400 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
13410 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  en */.    DWORD 
13420 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
13430 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
13440 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68   written by each
13450 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c   WriteFile() cal
13460 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c  l */.    DWORD l
13470 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
13480 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20  ROR;   /* Value 
13490 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
134a0 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23  astError() */..#
134b0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
134c0 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  NCE.    memset(&
134d0 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
134e0 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
134f0 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  ));.    overlapp
13500 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
13510 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
13520 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65  ffffff);.    ove
13530 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
13540 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
13550 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
13560 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a  fffff);.#endif..
13570 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
13580 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  0 ){.#if SQLITE_
13590 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69  OS_WINCE.      i
135a0 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
135b0 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
135c0 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30  nRem, &nWrite, 0
135d0 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ) ){.#else.     
135e0 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
135f0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
13600 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
13610 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b   &overlapped) ){
13620 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
13630 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
13640 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
13650 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
13660 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
13670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13680 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
13690 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57  0 || nWrite<=(DW
136a0 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20  ORD)nRem );.    
136b0 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20    if( nWrite==0 
136c0 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44  || nWrite>(DWORD
136d0 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  )nRem ){.       
136e0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
136f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
13700 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13710 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54      }.#if !SQLIT
13720 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20  E_OS_WINCE.     
13730 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74   offset += nWrit
13740 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  e;.      overlap
13750 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
13760 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
13770 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
13780 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13790 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
137a0 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
137b0 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
137c0 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20  f.      aRem += 
137d0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52  nWrite;.      nR
137e0 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em -= nWrite;.  
137f0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d    }.    if( nRem
13800 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  >0 ){.      pFil
13810 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13820 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
13830 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
13840 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
13850 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65     if(   ( pFile
13860 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
13870 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46  OR_HANDLE_DISK_F
13880 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20  ULL ).       || 
13890 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
138a0 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46  no==ERROR_DISK_F
138b0 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53  ULL )){.      OS
138c0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69  TRACE(("WRITE fi
138d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
138e0 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d  _FULL\n", pFile-
138f0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
13900 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
13910 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c  QLITE_FULL, pFil
13920 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
13950 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
13960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54  );.    }.    OST
13970 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
13980 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13990 49 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20  IOERR_WRITE\n", 
139a0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
139b0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
139c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
139d0 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  WRITE, pFile->la
139e0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69  "winWrite2", pFi
13a10 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
13a20 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49  lse{.    winLogI
13a30 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
13a40 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  }.  OSTRACE(("WR
13a50 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
13a60 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
13a70 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
13a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13a90 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
13aa0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
13ab0 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
13ac0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13ad0 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
13ae0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
13af0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
13b00 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
13b10 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
13b20 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
13b30 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
13b40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13b50 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
13b60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
13b70 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
13b80 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
13b90 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  Errno;..  assert
13ba0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
13bb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
13bc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13bd0 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53  _TRUNCATE);.  OS
13be0 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
13bf0 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25   file=%p, size=%
13c00 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
13c10 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
13c20 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69  e->h, nByte, pFi
13c30 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
13c40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
13c50 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
13c60 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
13c70 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
13c80 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
13c90 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
13ca0 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
13cb0 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
13cc0 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
13cd0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
13ce0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
13cf0 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
13d00 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
13d10 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
13d20 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
13d30 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
13d40 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
13d50 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
13d60 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
13d70 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
13d80 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
13d90 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  k;.  }..  /* Set
13da0 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75  EndOfFile() retu
13db0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65  rns non-zero whe
13dc0 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  n successful, or
13dd0 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61   zero when it fa
13de0 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69  ils. */.  if( wi
13df0 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
13e00 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72   nByte) ){.    r
13e10 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
13e20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
13e30 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
13e40 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
13e60 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46  inTruncate1", pF
13e70 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
13e80 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65  else if( 0==osSe
13e90 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65  tEndOfFile(pFile
13ea0 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20  ->h) &&.        
13eb0 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20      ((lastErrno 
13ec0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13ed0 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f  ())!=ERROR_USER_
13ee0 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a  MAPPED_FILE) ){.
13ef0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13f00 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
13f10 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
13f20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
13f30 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
13f40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
13f70 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
13f80 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  h);.  }..#if SQL
13f90 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
13fa0 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E>0.  /* If the 
13fb0 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74  file was truncat
13fc0 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
13fd0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
13fe0 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70  rrently.  ** map
13ff0 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
14000 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
14010 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
14020 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
14030 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64  ll.  ** use read
14040 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
14050 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
14060 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
14070 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a  from now on..  *
14080 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
14090 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79  MapRegion && nBy
140a0 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  te<pFile->mmapSi
140b0 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ze ){.    pFile-
140c0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
140d0 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
140e0 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
140f0 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ATE file=%p, rc=
14100 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
14110 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
14120 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
14130 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
14140 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
14150 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
14160 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
14170 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
14180 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
14190 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
141a0 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
141b0 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
141c0 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
141d0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
141e0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
141f0 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
14200 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
14210 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
14220 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
14230 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
14240 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
14250 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
14260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14270 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
14280 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
14290 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
142a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
142b0 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
142c0 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
142d0 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
142e0 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
142f0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
14300 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
14310 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
14320 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
14330 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53  \.    (defined(S
14340 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
14350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14360 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  BUG)).  /*.  ** 
14370 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
14380 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
14390 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
143a0 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
143b0 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
143c0 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
143d0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
143e0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
143f0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
14400 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
14410 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14420 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
14430 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
14440 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
14450 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
14460 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
14470 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
14480 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
14490 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
144a0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
144b0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
144c0 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
144d0 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
144e0 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
144f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
14500 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
14510 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
14520 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
14530 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
14540 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
14550 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
14560 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
14570 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
14580 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
14590 43 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73  C file=%p, flags
145a0 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%x, lock=%d\n",
145b0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
145c0 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69  e->h, flags, pFi
145d0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
145e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
145f0 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
14600 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
14610 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61  #else.  if( (fla
14620 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
14630 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20  _SYNC_FULL ){.  
14640 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79    sqlite3_fullsy
14650 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a  nc_count++;.  }.
14660 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
14670 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
14680 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
14690 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
146a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
146b0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
146c0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
146d0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
146e0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52  E_NO_SYNC.  OSTR
146f0 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66  ACE(("SYNC-NOP f
14700 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
14710 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
14720 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
14730 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
14740 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c   rc = osFlushFil
14750 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e  eBuffers(pFile->
14760 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
14770 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20  Error( rc=FALSE 
14780 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
14790 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
147a0 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
147b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
147c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
147d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
147e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
147f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
14800 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
14810 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59      OSTRACE(("SY
14820 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  NC file=%p, rc=S
14830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
14840 43 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  C\n", pFile->h))
14850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
14860 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14870 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69  IOERR_FSYNC, pFi
14880 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c        "winSync",
148b0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
148c0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
148d0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
148e0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
148f0 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
14900 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
14910 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  winFileSize(sqli
14920 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
14930 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
14940 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ze){.  winFile *
14950 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
14960 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
14970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
14980 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
14990 20 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21    assert( pSize!
149a0 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
149b0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
149c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
149d0 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  T);.  OSTRACE(("
149e0 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
149f0 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  ize=%p\n", pFile
14a00 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23  ->h, pSize));..#
14a10 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
14a20 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
14a30 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
14a40 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
14a50 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
14a60 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
14a70 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
14a80 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
14ab0 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
14ac0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
14ad0 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
14ae0 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
14af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
14b00 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14b10 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
14b20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
14b30 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14b40 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
14b50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b70 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
14b80 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
14b90 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
14ba0 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
14bb0 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
14bc0 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
14bd0 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
14be0 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
14bf0 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
14c00 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
14c10 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
14c20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
14c30 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
14c40 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
14c50 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
14c60 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
14c70 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
14c80 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
14c90 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14ca0 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
14cb0 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
14cc0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14cd0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14ce0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
14cf0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14d00 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
14d10 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
14d40 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
14d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14d60 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  f.  OSTRACE(("SI
14d70 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
14d80 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c  e=%p, *pSize=%ll
14d90 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
14da0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
14db0 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c  , pSize, *pSize,
14dc0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
14dd0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
14de0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
14df0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
14e00 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
14e10 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
14e20 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
14e30 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
14e40 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
14e50 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
14e60 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
14e70 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
14e80 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
14e90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
14ea0 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
14eb0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
14ec0 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
14ed0 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
14ee0 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
14ef0 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
14f00 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
14f10 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
14f20 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
14f30 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
14f40 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
14f50 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
14f60 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
14f70 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
14f80 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
14f90 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
14fa0 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
14fb0 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
14fc0 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
14fd0 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
14fe0 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
14ff0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
15000 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
15010 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
15020 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
15030 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
15040 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
15050 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
15060 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
15070 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
15080 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
15090 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
150a0 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
150d0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
150e0 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
150f0 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
15100 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
15110 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
15120 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
15130 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
15140 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
15150 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
15160 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
15170 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
15180 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
15190 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
151a0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
151b0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
151c0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
151d0 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
151e0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
151f0 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
15200 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
15210 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
15220 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
15230 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
15240 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
15250 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
15260 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52  atic int winGetR
15270 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
15280 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
15290 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
152a0 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
152b0 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
152c0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
152d0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
152e0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
152f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
15300 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  E.    /*.    ** 
15310 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
15320 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
15330 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
15340 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
15350 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20   Win32.    **   
15360 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
15370 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  Ex..    */.    r
15380 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69  es = winceLockFi
15390 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
153a0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
153b0 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
153c0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
153d0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
153e0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
153f0 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
15400 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
15420 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65  RED_SIZE, 0);.#e
15430 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
15440 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
15450 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
15460 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
15470 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
15480 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
15490 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
154a0 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
154b0 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37  short)((lk & 0x7
154c0 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
154d0 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20  _SIZE - 1));.   
154e0 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
154f0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
15500 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
15510 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
15520 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
15530 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
15540 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
15550 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
15560 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d  dif.  if( res ==
15570 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
15580 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
15590 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
155a0 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
155b0 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74   log a failure t
155c0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  o lock */.  }.  
155d0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
155e0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
155f0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
15600 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
15610 72 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  res)));.  return
15620 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
15630 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
15640 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15650 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
15660 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
15670 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
15680 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
15690 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
156a0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
156b0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
156c0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
156d0 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
156e0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
156f0 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
15700 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
15710 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
15720 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
15730 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
15740 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
15750 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
15760 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
15770 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
15780 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
15790 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
157a0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
157b0 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
157c0 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
157d0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
157e0 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
157f0 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
15800 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15810 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
15820 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15830 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
15840 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15850 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15860 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61     "winUnlockRea
15870 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
15880 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  Path);.  }.  OST
15890 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
158a0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  CK file=%p, rc=%
158b0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
158c0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
158d0 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  es)));.  return 
158e0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
158f0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
15900 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
15910 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
15920 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
15930 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
15940 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
15950 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
15960 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
15970 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
15980 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
15990 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
159a0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
159b0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
159c0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
159d0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
159e0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
159f0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
15a00 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
15a10 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
15a20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
15a30 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
15a40 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
15a50 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
15a60 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
15a70 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
15a80 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
15a90 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
15aa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
15ab0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
15ac0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
15ad0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
15ae0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
15af0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
15b00 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
15b10 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
15b20 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
15b30 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
15b40 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
15b50 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
15b60 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
15b70 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
15b80 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
15b90 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
15ba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
15bb0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
15bc0 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
15bd0 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
15be0 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
15bf0 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
15c00 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
15c10 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
15c20 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
15c30 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
15c40 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
15c50 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
15c60 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
15c70 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
15c80 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
15c90 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
15ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
15cb0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15cc0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
15cd0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
15ce0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
15cf0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
15d00 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
15d10 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
15d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15d30 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73  ult of a Windows
15d40 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
15d50 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
15d60 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
15d70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
15d80 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
15d90 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
15da0 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
15db0 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
15dc0 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
15dd0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
15de0 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
15df0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
15e00 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
15e10 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
15e20 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
15e30 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
15e40 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
15e50 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25  le=%p, oldLock=%
15e60 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25  d(%d), newLock=%
15e70 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
15e80 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
15e90 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
15ea0 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
15eb0 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e, locktype));. 
15ec0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
15ed0 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
15ee0 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 4f 53  NOLOCK ){.    OS
15ef0 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 4e 4f 50  TRACE(("LOCK-NOP
15f00 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15f10 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15f20 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
15f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15f40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
15f50 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
15f60 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
15f70 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
15f80 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
15f90 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
15fa0 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
15fb0 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
15fc0 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
15fd0 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
15fe0 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
15ff0 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16000 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
16010 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
16020 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
16030 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65  ("LOCK-HELD file
16040 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
16050 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
16060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16070 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
16080 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
16090 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
160a0 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
160b0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
160c0 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
160d0 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
160e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
160f0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
16100 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
16110 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
16120 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
16130 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
16140 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
16150 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  _LOCK );..  /* L
16160 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f  ock the PENDING_
16170 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20  LOCK byte if we 
16180 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  need to acquire 
16190 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f  a PENDING lock o
161a0 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20  r.  ** a SHARED 
161b0 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65  lock.  If we are
161c0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
161d0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63  RED lock, the ac
161e0 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a  quisition of.  *
161f0 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  * the PENDING_LO
16200 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f  CK byte is tempo
16210 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77  rary..  */.  new
16220 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65  Locktype = pFile
16230 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
16240 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  (   (pFile->lock
16250 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20  type==NO_LOCK). 
16260 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b      || (   (lock
16270 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16280 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26  LOCK).         &
16290 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  & (pFile->lockty
162a0 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
162b0 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  K)).  ){.    int
162c0 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
162d0 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
162e0 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
162f0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
16300 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
16310 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
16340 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
16350 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
16360 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
16370 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
16380 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
16390 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
163a0 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
163b0 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
163c0 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
163d0 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
163e0 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
163f0 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
16400 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
16410 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
16420 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
16430 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
16440 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
16450 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
16460 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
16470 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
16480 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
16490 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
164a0 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41    */.      OSTRA
164b0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
164c0 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
164d0 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c  count=%d, rc=%s\
164e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
164f0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
16500 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16510 28 72 65 73 29 29 29 3b 0a 20 20 20 20 20 20 69  (res)));.      i
16520 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33  f( cnt ) sqlite3
16530 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b  _win32_sleep(1);
16540 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
16550 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
16560 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
16570 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
16580 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16590 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
165a0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
165b0 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
165c0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
165d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
165e0 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
165f0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
16600 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
16610 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52 65    res = winGetRe
16620 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
16630 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
16640 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
16650 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
16660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16670 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16680 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16690 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
166a0 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
166b0 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
166c0 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
166d0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
166e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
166f0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16700 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16710 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
16720 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
16730 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
16740 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f  FLAGS, RESERVED_
16750 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
16760 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
16770 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
16780 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   = RESERVED_LOCK
16790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167a0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
167b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
167c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
167d0 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
167e0 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
167f0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
16800 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
16810 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
16820 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
16830 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
16840 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
16850 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
16860 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16870 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
16880 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
16890 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
168a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
168b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
168c0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
168d0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52  res = winUnlockR
168e0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
168f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
16900 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16910 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16920 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46  _FLAGS, SHARED_F
16930 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20  IRST, 0,.       
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16950 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
16960 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
16970 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
16980 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
16990 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
169a0 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
169b0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
169c0 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52 65  ;.      winGetRe
169d0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
169e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
169f0 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
16a00 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
16a10 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
16a20 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
16a30 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
16a40 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
16a50 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
16a60 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
16a70 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
16a80 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
16a90 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
16aa0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
16ab0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
16ac0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
16ad0 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
16ae0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
16af0 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
16b00 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
16b10 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
16b20 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
16b30 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
16b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
16b50 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
16b60 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
16b70 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
16b80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
16b90 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46  OSTRACE(("LOCK-F
16ba0 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e  AIL file=%p, wan
16bb0 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e  ted=%d, got=%d\n
16bc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16bd0 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
16be0 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
16bf0 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
16c00 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e  locktype = (u8)n
16c10 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  ewLocktype;.  OS
16c20 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c  TRACE(("LOCK fil
16c30 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
16c40 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
16c50 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
16c60 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
16c70 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
16c80 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
16c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16ca0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
16cb0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
16cc0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
16cd0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
16ce0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
16cf0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
16d00 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
16d10 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
16d20 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
16d30 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
16d40 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
16d50 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
16d60 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
16d70 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
16d80 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sOut){.  int rc;
16d90 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16da0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16db0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
16dc0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
16dd0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
16de0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
16df0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16e00 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
16e10 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
16e20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
16e30 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ut));..  assert(
16e40 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   id!=0 );.  if( 
16e50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
16e60 20 26 20 57 49 4e 46 49 4c 45 5f 4e 4f 4c 4f 43   & WINFILE_NOLOC
16e70 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  K ){.    rc = 0;
16e80 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
16e90 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
16ea0 3d 25 70 2c 20 72 63 3d 25 64 20 28 6e 6f 70 29  =%p, rc=%d (nop)
16eb0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
16ec0 63 29 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c));.  }else if(
16ed0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16ee0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
16ef0 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
16f00 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
16f10 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
16f20 70 2c 20 72 63 3d 25 64 20 28 6c 6f 63 61 6c 29  p, rc=%d (local)
16f30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
16f40 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
16f50 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69    rc = winLockFi
16f60 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
16f70 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
16f80 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42  FLAGS,RESERVED_B
16f90 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
16fa0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16fb0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
16fc0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
16fd0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
16fe0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
16ff0 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54  c = !rc;.    OST
17000 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
17010 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
17020 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
17030 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
17040 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
17050 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
17060 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
17070 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
17080 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
17090 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
170a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
170b0 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a  e->h, pResOut, *
170c0 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
170d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
170e0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
170f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17100 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
17110 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
17120 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
17130 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17140 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17150 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
17160 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17170 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17180 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17190 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
171a0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
171b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
171c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
171d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
171e0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
171f0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
17200 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
17210 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17220 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
17230 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
17240 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
17250 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
17260 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
17270 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
17280 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
17290 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
172a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
172b0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
172c0 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
172d0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
172e0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
172f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17300 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
17310 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
17320 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
17330 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
17340 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17350 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
17360 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
17370 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
17380 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
17390 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
173a0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
173b0 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
173c0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
173d0 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
173e0 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
173f0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
17400 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
17410 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
17420 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
17430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17440 0a 20 20 7d 0a 20 20 74 79 70 65 20 3d 20 70 46  .  }.  type = pF
17450 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
17460 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
17470 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
17480 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
17490 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
174a0 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
174b0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
174c0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
174d0 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69  ARED_LOCK && !wi
174e0 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
174f0 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  le) ){.      /* 
17500 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
17510 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68  r happen.  We sh
17520 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
17530 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
17540 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
17550 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
17560 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
17570 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
17580 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74  NLOCK, osGetLast
17590 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
175c0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
175d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
175e0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
175f0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17600 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17610 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
17620 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
17630 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
17640 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
17650 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
17660 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
17670 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
17680 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
17690 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  NG_LOCK ){.    w
176a0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
176b0 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
176c0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
176d0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
176e0 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
176f0 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
17700 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
17710 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
17720 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17730 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
17740 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
17750 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
17760 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17770 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
17780 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
17790 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
177a0 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
177b0 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
177c0 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
177d0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
177e0 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
177f0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
17800 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
17810 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
17820 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
17830 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
17840 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
17850 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
17860 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77  oid winModeBit(w
17870 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  inFile *pFile, u
17880 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
17890 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
178a0 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
178b0 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
178c0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
178d0 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
178e0 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
178f0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
17900 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
17910 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
17920 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17930 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
17940 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
17950 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65  rences to VFS he
17960 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65  lper methods use
17970 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
17980 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
17990 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
179a0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
179b0 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74  , char **);.stat
179c0 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
179d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73  const void *);.s
179e0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
179f0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
17a00 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lon(const char *
17a10 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  );../*.** Contro
17a20 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
17a30 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
17a40 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
17a50 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
17a60 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
17a70 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
17a80 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
17a90 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
17aa0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52  File*)id;.  OSTR
17ab0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
17ac0 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67  =%p, op=%d, pArg
17ad0 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
17ae0 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20  , op, pArg));.  
17af0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
17b00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
17b10 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
17b20 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
17b30 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  rg = pFile->lock
17b40 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52  type;.      OSTR
17b50 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
17b60 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
17b70 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
17b80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
17b90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
17ba0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
17bb0 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
17bc0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
17bd0 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
17be0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f  stErrno;.      O
17bf0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
17c00 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
17c10 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
17c20 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
17c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
17c40 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
17c50 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
17c60 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
17c70 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
17c80 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
17c90 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
17ca0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
17cb0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
17cc0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
17cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17ce0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
17cf0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
17d00 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
17d10 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
17d20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  k>0 ){.        s
17d30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64  qlite3_int64 old
17d40 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Sz;.        int 
17d50 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
17d60 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20  (id, &oldSz);.  
17d70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17d90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
17da0 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c  64 newSz = *(sql
17db0 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
17dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17dd0 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20  newSz>oldSz ){. 
17de0 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
17df0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17e00 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
17e10 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
17e20 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20  e(id, newSz);.  
17e30 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
17e40 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
17e50 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
17e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17e70 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
17e80 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
17e90 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
17ea0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17eb0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
17ec0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17ed0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17ee0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17ef0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17f00 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
17f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
17f30 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
17f40 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
17f50 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
17f60 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
17f70 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74  ERSIST_WAL, (int
17f80 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f  *)pArg);.      O
17f90 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
17fa0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
17fb0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
17fc0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
17fd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
17fe0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
17ff0 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
18000 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
18010 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
18020 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
18030 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
18040 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
18050 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18060 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18070 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
18080 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18090 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
180a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
180b0 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
180c0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
180d0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
180e0 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
180f0 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
18100 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18110 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18120 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18130 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18150 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18160 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
18170 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b  IN32_AV_RETRY: {
18180 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20  .      int *a = 
18190 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
181a0 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a    if( a[0]>0 ){.
181b0 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
181c0 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
181d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
181e0 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65     a[0] = winIoe
181f0 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
18200 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
18210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
18220 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
18230 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
18240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
18250 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72  ] = winIoerrRetr
18260 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a  yDelay;.      }.
18270 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18280 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18290 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
182a0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
182b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
182c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
182d0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
182e0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
182f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
18300 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
18310 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
18320 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
18330 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
18340 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18360 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
18370 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
18380 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18390 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
183a0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
183b0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
183c0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
183d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
183e0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
183f0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
18400 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18410 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
18420 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
18430 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
18440 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
18450 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
18460 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
18470 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18480 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
18490 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
184a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
184b0 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
184c0 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
184d0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
184e0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
184f0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
18500 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
18510 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
18520 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
18530 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
18540 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
18550 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
18560 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
18570 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
18580 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55  {.          winU
18590 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
185a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
185b0 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
185c0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
185d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
185e0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
185f0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
18600 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
18610 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
18620 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18630 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
18640 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
18650 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18660 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
18670 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
18680 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18690 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
186a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
186b0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
186c0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
186d0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
186e0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
186f0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
18700 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
18710 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
18720 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
18730 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
18740 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
18750 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
18760 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
18770 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
18780 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
18790 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
187a0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
187b0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
187c0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
187d0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
187e0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
187f0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
18800 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
18810 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
18820 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
18830 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
18840 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
18850 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
18860 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
18870 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18880 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
18890 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
188a0 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
188b0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
188c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
188d0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
188e0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
188f0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
18900 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
18910 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
18920 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
18930 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
18940 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
18950 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
18960 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
18970 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
18980 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
18990 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  ;.}../* .** Wind
189a0 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
189b0 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
189c0 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
189d0 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
189e0 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
189f0 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
18a00 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
18a10 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
18a20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
18a30 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
18a40 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
18a50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54  ..*/.static SYST
18a60 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e  EM_INFO winSysIn
18a70 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  fo;..#ifndef SQL
18a80 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
18a90 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
18aa0 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
18ab0 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
18ac0 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
18ad0 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
18ae0 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
18af0 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f  rotect the winLo
18b00 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75  ckInfo objects u
18b10 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  sed by .** this 
18b20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
18b30 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
18b40 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
18b50 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
18b60 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
18b70 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
18b80 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
18b90 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
18ba0 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
18bb0 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
18bc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
18bd0 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
18be0 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
18bf0 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
18c00 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
18c10 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
18c20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
18c30 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
18c40 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
18c50 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
18c60 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
18c70 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
18c80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18c90 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
18ca0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
18cb0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
18cc0 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
18cd0 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
18ce0 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
18cf0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18d00 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
18d10 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
18d20 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
18d30 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
18d40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
18d50 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
18d60 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
18d70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18d80 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
18d90 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
18da0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
18db0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18dc0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
18dd0 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
18de0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
18df0 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
18e00 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
18e10 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
18e20 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
18e30 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
18e40 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
18e50 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
18e60 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
18e70 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
18e80 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
18e90 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
18ea0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
18eb0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
18ec0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
18ed0 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
18ee0 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
18ef0 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
18f00 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
18f10 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
18f20 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
18f30 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
18f40 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
18f50 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
18f60 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
18f70 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
18f80 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
18f90 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
18fa0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18fb0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
18fc0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
18fd0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18fe0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
18ff0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
19000 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
19010 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
19020 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
19030 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
19040 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
19050 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
19060 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
19070 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
19080 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
19090 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
190a0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
190b0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
190c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
190d0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
190e0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
190f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
19100 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
19110 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
19120 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
19130 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
19140 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
19150 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
19160 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
19170 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19190 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
191a0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
191b0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
191d0 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
191e0 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
191f0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
19200 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
19210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19220 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
19230 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
19240 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
19250 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
19260 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
19270 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
19280 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
19290 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
192a0 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
192b0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
192e0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
192f0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
19300 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
19310 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19320 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
19330 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
19340 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
19350 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
19360 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
19370 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
19380 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
19390 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
193a0 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
193b0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
193c0 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
193d0 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
193e0 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
193f0 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
19400 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
19410 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
19420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
19430 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
19440 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
19450 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
19460 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
19470 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
19480 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
19490 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
194a0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
194b0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
194c0 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
194d0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
194e0 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
194f0 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
19500 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
19510 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
19520 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
19530 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
19540 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
19550 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
19560 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
19570 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
19580 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
19590 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
195a0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
195b0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
195c0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
195d0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
195e0 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
195f0 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
19600 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
19610 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
19620 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
19630 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
19640 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
19650 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19660 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
19670 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
19680 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
19690 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
196a0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
196b0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
196c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
196d0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
196e0 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
196f0 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
19700 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
19710 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19720 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19730 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19750 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
19760 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
19770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19780 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
197b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
197c0 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
197d0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
197e0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
197f0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
19800 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
19810 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
19820 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
19830 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
19840 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
19850 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
19860 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
19870 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
19880 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
19890 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
198a0 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
198b0 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
198c0 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
198d0 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
198e0 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
198f0 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
19900 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
19910 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
19920 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
19930 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
19940 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
19950 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
19960 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
19970 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
19980 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
19990 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
199a0 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
199b0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
199c0 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
199d0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
199e0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
199f0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
19a00 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
19a10 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
19a20 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
19a30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
19a40 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
19a50 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
19a60 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
19a70 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19a80 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
19a90 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
19aa0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
19ab0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
19ac0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
19ad0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
19ae0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
19af0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19b00 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
19b10 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
19b20 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
19b30 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
19b40 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74   lock=%d, offset
19b50 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c  =%d, size=%d\n",
19b60 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19b70 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b  e->hFile.h, lock
19b80 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74  Type, ofst, nByt
19b90 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  e));..  /* Relea
19ba0 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
19bb0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
19bc0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
19bd0 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29  pe==_SHM_UNLCK )
19be0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e  {.    rc = winUn
19bf0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
19c00 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
19c10 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
19c20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
19c30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
19c40 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
19c50 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
19c60 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
19c70 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
19c80 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
19c90 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
19ca0 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
19cb0 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
19cc0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  _LOCK;.    rc = 
19cd0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
19ce0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
19cf0 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  lags, ofst, 0, n
19d00 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Byte, 0);.  }.  
19d10 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
19d20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19d30 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
19d40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
19d50 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
19d60 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
19d70 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19d80 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
19d90 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
19da0 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
19db0 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
19dc0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
19dd0 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
19de0 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43  ype == _SHM_UNLC
19df0 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46  K) ? "winUnlockF
19e00 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ile" :.         
19e10 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c    "winLockFile",
19e20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19e30 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  o, sqlite3ErrNam
19e40 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75  e(rc)));..  retu
19e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
19e60 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
19e70 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
19e80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19e90 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
19ea0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
19eb0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
19ec0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
19ed0 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
19ee0 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
19ef0 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
19f00 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
19f10 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
19f20 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
19f30 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
19f40 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
19f50 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
19f60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19f70 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
19f80 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
19f90 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
19fa0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19fb0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
19fc0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
19fd0 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
19fe0 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
19ff0 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
1a000 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
1a010 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73  hmNode *p;.  ass
1a020 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
1a030 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52  Held() );.  OSTR
1a040 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
1a050 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46  pid=%lu, deleteF
1a060 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lag=%d\n",.     
1a070 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1a080 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64  ntProcessId(), d
1a090 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70  eleteFlag));.  p
1a0a0 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
1a0b0 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
1a0c0 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
1a0d0 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
1a0e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1a0f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
1a100 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d  tex ){ sqlite3_m
1a110 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1a120 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72  ex); }.      for
1a130 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1a140 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1a150 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55    BOOL bRc = osU
1a160 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1a170 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
1a180 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
1a190 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
1a1a0 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  UNMAP pid=%lu, r
1a1b0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
1a1c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a1d0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1a1e0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
1a1f0 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
1a200 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1a210 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
1a220 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
1a230 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
1a240 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
1a250 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
1a260 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1a270 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45  "SHM-PURGE-CLOSE
1a280 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1a290 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1a2c0 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1a2d0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1a2e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1a2f0 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1a300 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d  UE(bRc);.      }
1a310 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46  .      if( p->hF
1a320 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  ile.h!=NULL && p
1a330 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c  ->hFile.h!=INVAL
1a340 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1a350 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1a360 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a370 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
1a380 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
1a390 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
1a3a0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1a3b0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a3c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1a3d0 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
1a3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1a3f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a400 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
1a410 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
1a420 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1a430 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
1a440 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
1a450 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1a460 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1a470 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
1a480 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1a490 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1a4a0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
1a4b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
1a4c0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
1a4d0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1a4e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1a4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
1a500 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
1a510 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a520 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
1a530 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1a540 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1a550 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1a560 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
1a570 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
1a580 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
1a590 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
1a5a0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
1a5b0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
1a5c0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
1a5d0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1a5e0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1a5f0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1a600 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1a610 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1a620 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1a630 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
1a640 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1a650 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1a660 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
1a670 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1a680 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1a690 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1a6a0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1a6b0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1a6c0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1a6d0 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
1a6e0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1a6f0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1a700 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1a730 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
1a740 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
1a750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a760 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
1a770 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
1a780 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
1a7b0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
1a7c0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
1a7d0 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
1a7e0 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
1a7f0 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
1a800 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1a810 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
1a820 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
1a830 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
1a840 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
1a850 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1a860 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
1a870 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
1a880 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
1a890 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1a8a0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
1a8b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a8c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1a8d0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1a8e0 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a  trlen30(pDbFd->z
1a8f0 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Path);.  pNew = 
1a900 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1a910 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  o( sizeof(*pShmN
1a920 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ode) + nName + 1
1a930 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  7 );.  if( pNew=
1a940 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a950 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72  3_free(p);.    r
1a960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a970 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1a980 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
1a990 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
1a9a0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1a9b0 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20  rintf(nName+15, 
1a9c0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
1a9d0 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
1a9e0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69  ->zPath);.  sqli
1a9f0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
1aa00 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65  DbFd->zPath, pNe
1aa10 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a  w->zFilename); .
1aa20 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
1aa30 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1aa40 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
1aa50 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
1aa60 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
1aa70 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
1aa80 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
1aa90 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
1aaa0 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
1aab0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1aac0 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
1aad0 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
1aae0 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
1aaf0 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
1ab00 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
1ab10 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
1ab20 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
1ab30 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
1ab40 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
1ab50 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
1ab60 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
1ab70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1ab80 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1ab90 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
1aba0 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
1abb0 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
1abc0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
1abd0 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
1abe0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1abf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
1ac00 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
1ac10 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
1ac20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
1ac30 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
1ac40 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1ac50 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
1ac60 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
1ac70 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1ac80 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
1ac90 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
1aca0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1acb0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1acc0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1acd0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1ace0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1acf0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1ad00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1ad10 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1ad20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1ad30 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1ad40 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
1ad50 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
1ad60 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1ad70 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ad90 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1ada0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1adc0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
1add0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
1ade0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
1adf0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1ae00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1ae10 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  N_WAL | SQLITE_O
1ae20 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1ae30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ae40 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
1ae50 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
1ae60 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1ae70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  {.      goto shm
1ae80 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1ae90 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1aea0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1aeb0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1aec0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1aed0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
1aee0 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1aef0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1af00 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
1af10 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
1af20 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1af30 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1af40 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1af50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1af60 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1af70 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1af80 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1af90 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1afa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1afb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1afc0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1afd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1afe0 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1aff0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1b020 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1b030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b050 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1b060 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1b070 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1b080 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1b090 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1b0a0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1b0b0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1b0c0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1b0d0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1b0e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1b0f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
1b100 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1b110 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1b120 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
1b130 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1b140 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1b150 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1b160 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
1b170 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1b180 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1b190 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1b1a0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1b1b0 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1b1c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1b1d0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1b1e0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1b1f0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1b200 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1b210 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1b220 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1b230 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1b240 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1b250 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1b260 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1b270 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1b280 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1b290 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1b2a0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1b2b0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1b2c0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1b2d0 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1b2e0 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1b2f0 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1b300 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1b310 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1b320 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1b330 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
1b340 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1b350 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b360 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1b370 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1b380 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1b390 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1b3a0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1b3b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b3c0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1b3d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b3e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1b3f0 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1b400 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1b410 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
1b420 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1b430 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1b440 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1b450 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
1b460 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
1b470 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
1b480 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1b490 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1b4a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1b4b0 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
1b4c0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
1b4d0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1b4e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b4f0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1b500 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1b510 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1b520 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1b530 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
1b540 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1b550 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1b560 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
1b570 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1b580 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1b590 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1b5a0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1b5b0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1b5c0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1b5d0 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
1b5e0 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
1b5f0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1b600 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1b610 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1b620 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1b630 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
1b640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b650 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1b660 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
1b670 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1b680 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
1b690 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
1b6a0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1b6b0 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
1b6c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1b6d0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1b6e0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1b6f0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
1b700 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
1b710 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
1b720 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1b730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
1b740 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1b750 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
1b760 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1b770 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1b780 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1b790 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1b7a0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1b7b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b7c0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1b7d0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1b7e0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1b7f0 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1b800 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1b810 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1b820 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1b830 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1b840 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1b850 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1b860 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1b870 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1b880 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1b890 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1b8a0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1b8b0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1b8c0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1b8d0 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1b8e0 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1b8f0 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1b900 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1b910 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1b920 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1b930 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1b940 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1b950 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
1b960 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1b970 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
1b980 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
1b990 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1b9a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b9b0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1b9c0 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1b9d0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1b9e0 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1b9f0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
1ba00 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1ba10 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1ba20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1ba30 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1ba40 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1ba50 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1ba60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1ba70 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1ba80 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1ba90 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bab0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1bac0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1bad0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1bae0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1baf0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1bb00 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1bb10 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
1bb20 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1bb30 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
1bb40 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1bb50 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1bb60 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1bb70 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1bb80 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1bb90 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1bba0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1bbb0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
1bbc0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbe0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1bbf0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1bc00 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1bc10 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1bc20 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1bc30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1bc60 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1bc90 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1bca0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1bcb0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
1bcc0 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1bcd0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1bce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1bcf0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1bd00 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1bd10 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1bd20 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1bd30 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1bd40 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1bd50 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1bd60 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1bd70 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1bd80 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1bd90 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1bda0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1bdb0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1bdc0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1bdd0 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1bde0 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1bdf0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1be00 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1be10 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1be20 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
1be30 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
1be40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
1be50 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
1be60 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
1be70 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1be80 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1be90 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1bea0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1beb0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
1bec0 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
1bed0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1bee0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
1bef0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
1bf00 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
1bf10 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
1bf20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1bf30 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1bf40 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1bf50 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
1bf60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bf70 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
1bf80 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
1bf90 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
1bfa0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
1bfb0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1bfc0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1bfd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
1bfe0 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
1bff0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
1c000 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
1c010 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1c020 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1c030 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1c040 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
1c050 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1c060 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
1c070 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c080 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
1c090 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1c0a0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1c0b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c0c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
1c0d0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1c0e0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1c0f0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1c100 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
1c110 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1c120 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
1c130 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
1c140 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
1c150 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1c160 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
1c170 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
1c180 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
1c190 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
1c1a0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
1c1b0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
1c1c0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
1c1d0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
1c1e0 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
1c1f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1c200 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
1c210 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
1c220 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
1c230 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1c240 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1c250 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1c260 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1c270 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1c280 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1c290 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1c2a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
1c2c0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
1c2d0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1c2e0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
1c2f0 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
1c300 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
1c310 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
1c320 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1c340 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
1c350 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1c360 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1c370 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1c380 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
1c390 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1c3a0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
1c3b0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1c3c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c3d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1c3e0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
1c3f0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
1c400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1c420 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
1c430 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1c440 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
1c450 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
1c460 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
1c470 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
1c480 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
1c490 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
1c4a0 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
1c4b0 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
1c4c0 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
1c4d0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1c4e0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1c4f0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1c500 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1c510 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
1c520 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
1c530 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1c540 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c550 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1c560 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c570 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1c580 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
1c590 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
1c5a0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
1c5b0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
1c5c0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
1c5d0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
1c5e0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
1c5f0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
1c600 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c620 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1c630 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1c640 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
1c650 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1c660 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1c670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c680 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
1c690 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1c6a0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
1c6b0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
1c6c0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
1c6d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1c6e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1c6f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c700 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1c710 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64  LOCK pid=%lu, id
1c720 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d  =%d, sharedMask=
1c730 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25  %03x, exclMask=%
1c740 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  03x, rc=%s\n",. 
1c750 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1c760 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1c770 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61  ), p->id, p->sha
1c780 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
1c790 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
1c7a0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1c7b0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
1c7c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1c7d0 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
1c7e0 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
1c7f0 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
1c800 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
1c810 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
1c820 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
1c830 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
1c840 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
1c850 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
1c860 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
1c870 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
1c880 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1c890 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
1c8a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1c8b0 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
1c8c0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c8d0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1c8e0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
1c8f0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1c900 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72  .  /* MemoryBarr
1c910 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e  ier(); // does n
1c920 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f  ot work -- do no
1c930 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a  t know why not *
1c940 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1c950 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d  utex();.  winShm
1c960 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
1c970 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c980 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1c990 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
1c9a0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
1c9b0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
1c9c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
1c9d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1c9e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c9f0 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
1ca00 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
1ca10 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
1ca20 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
1ca30 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
1ca40 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
1ca50 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
1ca60 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
1ca70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1ca80 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1ca90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1caa0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1cab0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
1cac0 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72  ise, if the isWr
1cad0 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ite parameter is
1cae0 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
1caf0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
1cb00 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
1cb10 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1cb20 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
1cb30 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
1cb40 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
1cb50 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
1cb60 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
1cb70 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1cb80 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1cb90 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72  ned. If .** isWr
1cba0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
1cbb0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1cbc0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1cbd0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
1cbe0 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
1cbf0 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
1cc00 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
1cc10 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1cc20 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
1cc30 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
1cc40 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
1cc50 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
1cc60 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
1cc70 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
1cc80 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
1cc90 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
1cca0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1ccb0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
1ccc0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1ccd0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
1cce0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1ccf0 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
1cd00 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
1cd10 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
1cd20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1cd30 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
1cd40 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1cd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1cd60 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
1cd70 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1cd80 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cda0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
1cdb0 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
1cdc0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1cdd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1cde0 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
1cdf0 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20    int isWrite,  
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
1ce20 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
1ce30 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
1ce40 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
1ce50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1ce60 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
1ce70 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1ce80 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
1ce90 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d  le*)fd;.  winShm
1cea0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1ceb0 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  m;.  winShmNode 
1cec0 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1ced0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cee0 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
1cef0 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
1cf00 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
1cf10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cf20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1cf30 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44  n rc;.    p = pD
1cf40 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1cf50 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1cf60 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69  ShmNode;..  sqli
1cf70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1cf80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1cf90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
1cfa0 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
1cfb0 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
1cfc0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
1cfd0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1cfe0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1cff0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
1d000 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
1d010 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1d020 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
1d030 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
1d040 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
1d050 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
1d060 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
1d070 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1d080 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
1d090 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
1d0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1d0b0 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
1d0c0 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
1d0d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
1d0e0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
1d0f0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
1d100 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
1d110 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
1d120 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1d130 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
1d140 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
1d150 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
1d160 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
1d170 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
1d180 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
1d190 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
1d1a0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
1d1b0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
1d1c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1d1d0 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1d1e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1d1f0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1d200 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
1d210 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d220 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1d230 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1d240 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1d250 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31       "winShmMap1
1d280 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1d290 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1d2a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1d2b0 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74  .    if( sz<nByt
1d2c0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
1d2d0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1d2e0 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
1d2f0 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57  ot exist. If isW
1d300 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20  rite is set to. 
1d310 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78       ** zero, ex
1d320 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
1d330 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
1d340 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1d350 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
1d360 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
1d370 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73  rnatively, if is
1d380 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1d390 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  o, use ftruncate
1d3a0 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
1d3b0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
1d3c0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1d3d0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1d3e0 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65      if( !isWrite
1d3f0 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
1d400 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  out;.      rc = 
1d410 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1d420 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1d430 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42  mNode->hFile, nB
1d440 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
1d450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1d470 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1d480 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1d490 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1d4a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1d4c0 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
1d4d0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1d4e0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1d4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d500 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
1d510 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1d520 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
1d530 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1d540 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
1d550 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
1d560 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
1d570 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
1d580 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1d590 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
1d5a0 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
1d5b0 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
1d5c0 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
1d5d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d5e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1d5f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1d600 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1d610 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1d620 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
1d630 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
1d640 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
1d650 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
1d660 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20  LE hMap = NULL; 
1d670 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
1d680 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
1d690 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
1d6a0 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
1d6b0 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
1d6c0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
1d6d0 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f      .#if SQLITE_
1d6e0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
1d6f0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1d700 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
1d710 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1d720 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1d730 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d740 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a  TE, nByte, NULL.
1d750 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
1d760 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1d770 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1d780 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1d790 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1d7a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1d7b0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55  h, .          NU
1d7c0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d7d0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1d7e0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1d7f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d800 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1d810 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1d820 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1d830 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gA(pShmNode->hFi
1d840 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
1d850 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1d860 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1d870 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1d880 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1d890 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52  ACE(("SHM-MAP-CR
1d8a0 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  EATE pid=%lu, re
1d8b0 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64  gion=%d, size=%d
1d8c0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d8d0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d8e0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d8f0 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1d900 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
1d920 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
1d930 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
1d940 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
1d950 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
1d960 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d970 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
1d980 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1d990 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1d9a0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1d9b0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1d9c0 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
1d9d0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
1d9e0 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
1d9f0 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
1da00 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
1da10 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
1da20 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
1da30 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1da40 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1da50 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1da60 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
1da70 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1da80 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1da90 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1daa0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1dab0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1dac0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
1dad0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
1dae0 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
1daf0 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
1db00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
1db10 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1db20 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
1db30 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
1db40 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1db50 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1db60 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1db70 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1db80 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1db90 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
1dbb0 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
1dbc0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1dbd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dbe0 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
1dbf0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
1dc00 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1dc10 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1dc20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1dc30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1dc40 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
1dc50 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1dc80 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
1dc90 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
1dca0 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
1dcb0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
1dcc0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1dcd0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1dce0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1dcf0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1dd00 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
1dd10 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
1dd20 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1dd30 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1dd40 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
1dd50 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1dd60 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1dd70 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1dd80 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1dd90 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1dda0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
1ddb0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
1ddc0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
1ddd0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1dde0 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1ddf0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1de00 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1de10 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
1de20 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
1de30 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
1de40 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
1de50 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
1de60 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
1de70 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1de80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1de90 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1dea0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1deb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1dec0 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
1ded0 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
1dee0 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
1def0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1df00 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
1df10 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
1df20 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
1df30 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1df40 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
1df50 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65  ** Cleans up the
1df60 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f   mapped region o
1df70 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1df80 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  file, if any..*/
1df90 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1dfa0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
1dfb0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
1dfc0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
1dfd0 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  le){.  assert( p
1dfe0 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54  File!=0 );.  OST
1dff0 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1e000 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1e010 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d  =%p, hMap=%p, pM
1e020 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1e030 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53            "mmapS
1e040 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ize=%lld, mmapSi
1e050 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d  zeActual=%lld, m
1e060 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c  mapSizeMax=%lld\
1e070 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1e080 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1e090 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
1e0a0 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c  File->hMap, pFil
1e0b0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20  e->pMapRegion,. 
1e0c0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1e0d0 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65  >mmapSize, pFile
1e0e0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1e0f0 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  , pFile->mmapSiz
1e100 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46  eMax));.  if( pF
1e110 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1e120 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e  ){.    if( !osUn
1e130 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
1e140 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1e150 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1e160 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1e170 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1e180 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
1e190 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1e1a0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
1e1b0 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
1e1d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1e1e0 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
1e1f0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e200 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
1e210 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61        pFile->pMa
1e220 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
1e230 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1e240 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e250 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1e260 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31    "winUnmapfile1
1e290 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1e2a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1e2b0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
1e2c0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
1e2d0 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
1e2e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
1e2f0 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  ctual = 0;.  }. 
1e300 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
1e310 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
1e320 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
1e330 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
1e340 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1e350 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1e360 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1e370 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1e380 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1e390 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25  pFile=%p, hMap=%
1e3a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1e3b0 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
1e3c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1e3d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1e3e0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1e3f0 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20  ->hMap));.      
1e400 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
1e410 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e420 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
1e430 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22   "winUnmapfile2"
1e460 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e470 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1e480 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
1e490 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55   }.  OSTRACE(("U
1e4a0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1e4b0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1e4c0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1e4d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e4e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e4f0 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  , pFile));.  ret
1e500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e510 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
1e520 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
1e530 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
1e540 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1e550 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
1e560 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
1e570 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
1e580 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
1e590 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
1e5a0 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
1e5b0 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
1e5c0 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
1e5d0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
1e5e0 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
1e5f0 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
1e600 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
1e610 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
1e620 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1e630 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
1e640 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
1e650 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
1e660 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
1e670 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
1e680 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
1e690 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
1e6a0 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
1e6b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
1e6c0 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
1e6d0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
1e6e0 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
1e6f0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
1e700 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
1e710 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
1e720 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
1e730 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
1e740 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
1e750 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
1e760 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
1e770 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
1e780 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d   whichever is sm
1e790 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  aller..**.** SQL
1e7a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e7b0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
1e7c0 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74  ccurs (even if t
1e7d0 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1e7e0 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61  t.** recreated a
1e7f0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75  s a result of ou
1e800 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1e810 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69  nces) or an SQLi
1e820 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
1e830 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1e840 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70  tatic int winMap
1e850 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1e860 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
1e870 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74   nByte){.  sqlit
1e880 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20  e3_int64 nMap = 
1e890 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b  nByte;.  int rc;
1e8a0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
1e8b0 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74  >=0 || pFd->nFet
1e8c0 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53  chOut==0 );.  OS
1e8d0 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1e8e0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1e8f0 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22  %p, size=%lld\n"
1e900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1e910 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1e920 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65  Id(), pFd, nByte
1e930 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e  ));..  if( pFd->
1e940 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
1e950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e960 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
1e970 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1e980 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1e990 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29  ile*)pFd, &nMap)
1e9a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1e9b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e9c0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e9d0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1e9e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1e9f0 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  T\n",.          
1ea00 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ea10 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1ea20 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d));.      retur
1ea30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1ea40 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  STAT;.    }.  }.
1ea50 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e    if( nMap>pFd->
1ea60 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20  mmapSizeMax ){. 
1ea70 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d     nMap = pFd->m
1ea80 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a  mapSizeMax;.  }.
1ea90 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69    nMap &= ~(sqli
1eaa0 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79  te3_int64)(winSy
1eab0 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1eac0 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e   - 1);. .  if( n
1ead0 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
1eae0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
1eaf0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1eb00 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
1eb10 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
1eb20 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
1eb30 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
1eb40 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
1eb50 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1eb60 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
1eb70 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
1eb80 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1eb90 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46  Fd);.    if( (pF
1eba0 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
1ebb0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
1ebc0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
1ebd0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
1ebe0 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
1ebf0 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
1ec00 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  TE;.    }.#if SQ
1ec10 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1ec20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1ec30 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1ec40 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c  gFromApp(pFd->h,
1ec50 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20   NULL, protect, 
1ec60 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  nMap, NULL);.#el
1ec70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ec80 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1ec90 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  ).    pFd->hMap 
1eca0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1ecb0 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e  ppingW(pFd->h, N
1ecc0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1ecf0 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
1ed00 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
1ed40 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1ed50 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1ed60 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1ed70 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d  S_ANSI).    pFd-
1ed80 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1ed90 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64  FileMappingA(pFd
1eda0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1edb0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61      (DWORD)((nMa
1ede0 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  p>>32) & 0xfffff
1edf0 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d        (DWORD)(nM
1ee20 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ap & 0xffffffff)
1ee30 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
1ee40 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61      if( pFd->hMa
1ee50 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
1ee60 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
1ee70 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1ee80 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1ee90 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1eea0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1eeb0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
1eee0 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  1", pFd->zPath);
1eef0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
1ef00 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
1ef10 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
1ef20 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
1ef30 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
1ef40 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1ef50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64  -FILE-CREATE pid
1ef60 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1ef70 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1ef80 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ef90 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1efa0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1efb0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1efc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1efd0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  _OK;.    }.    a
1efe0 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77  ssert( (nMap % w
1eff0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
1f000 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Size)==0 );.    
1f010 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53  assert( sizeof(S
1f020 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73  IZE_T)==sizeof(s
1f030 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c  qlite3_int64) ||
1f040 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66   nMap<=0xfffffff
1f050 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  f );.#if SQLITE_
1f060 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65  OS_WINRT.    pNe
1f070 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
1f080 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ileFromApp(pFd->
1f090 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
1f0a0 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23  (SIZE_T)nMap);.#
1f0b0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
1f0c0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1f0d0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1f0e0 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  , 0, 0, (SIZE_T)
1f0f0 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nMap);.#endif.  
1f100 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
1f110 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73   ){.      osClos
1f120 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61  eHandle(pFd->hMa
1f130 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68  p);.      pFd->h
1f140 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Map = NULL;.    
1f150 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1f160 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1f170 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1f180 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1f190 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1f1a0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1c0 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1f1d0 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e2", pFd->zPath)
1f1e0 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1f1f0 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1f200 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1f210 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1f220 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1f230 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1f240 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25  P-FILE-MAP pid=%
1f250 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1f260 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1f270 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f280 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f290 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
1f2a0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1f2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f2c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
1f2d0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
1f2e0 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
1f2f0 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
1f300 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
1f310 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
1f320 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1f330 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1f340 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1f350 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1f360 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f370 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f380 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
1f390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1f3a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
1f3b0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
1f3c0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
1f3d0 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
1f3e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
1f3f0 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
1f400 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
1f410 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
1f420 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
1f430 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
1f440 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
1f450 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
1f460 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
1f470 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
1f480 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
1f490 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1f4a0 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
1f4b0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
1f4c0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
1f4d0 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
1f4e0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
1f4f0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1f500 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
1f510 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1f520 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
1f530 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
1f540 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
1f550 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1f560 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
1f570 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
1f580 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
1f590 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
1f5a0 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
1f5b0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
1f5c0 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
1f5d0 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
1f5e0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
1f5f0 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1f600 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
1f610 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
1f620 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
1f630 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f640 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
1f650 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1f660 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1f670 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1f680 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
1f690 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1f6a0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
1f6b0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
1f6c0 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
1f6d0 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
1f6e0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f6f0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f700 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
1f710 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
1f720 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1f730 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
1f740 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
1f750 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
1f760 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
1f770 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1f780 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
1f790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f7a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f7b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1f7c0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1f7d0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1f7e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f7f0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f800 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1f810 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1f820 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1f830 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f840 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1f850 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
1f860 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
1f870 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
1f880 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
1f890 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
1f8a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
1f8b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1f8c0 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
1f8d0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1f8e0 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
1f8f0 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
1f900 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1f910 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f920 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
1f930 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
1f940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f950 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1f960 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
1f970 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
1f980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1f990 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
1f9a0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
1f9b0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1f9c0 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
1f9d0 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
1f9e0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1f9f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1fa00 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
1fa10 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
1fa20 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
1fa30 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
1fa40 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
1fa50 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
1fa60 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
1fa70 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
1fa80 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1fa90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1faa0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a  s being called .
1fab0 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
1fac0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
1fad0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
1fae0 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
1faf0 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61  g mapping .** ma
1fb00 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
1fb10 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
1fb20 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
1fb30 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
1fb40 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1fb50 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
1fb60 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
1fb70 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1fb80 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
1fb90 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1fba0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1fbb0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1fbc0 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
1fbd0 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
1fbe0 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
1fbf0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1fc00 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
1fc10 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
1fc20 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
1fc30 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
1fc40 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
1fc50 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
1fc60 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1fc70 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
1fc80 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
1fc90 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
1fca0 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
1fcb0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
1fcc0 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
1fcd0 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
1fce0 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
1fcf0 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
1fd00 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
1fd10 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
1fd20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
1fd30 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1fd40 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
1fd50 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  ld, p=%p\n",.   
1fd60 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1fd70 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1fd80 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b   pFd, iOff, p));
1fd90 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
1fda0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
1fdb0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
1fdc0 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69  /* FIXME:  If Wi
1fdd0 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61  ndows truly alwa
1fde0 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e  ys prevents trun
1fdf0 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69  cating or deleti
1fe00 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ng a.    ** file
1fe10 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67   while a mapping
1fe20 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74   is held, then t
1fe30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e  he following win
1fe40 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c  Unmapfile() call
1fe50 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63  .    ** is unnec
1fe60 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62  essary can can b
1fe70 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
1fe80 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
1fe90 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
1fea0 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
1feb0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1fec0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1fed0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
1fee0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
1fef0 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
1ff00 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1ff10 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1ff20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ff30 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1ff40 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
1ff50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ff60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
1ff70 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1ff80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1ff90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1ffa0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1ffb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1ffc0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1ffd0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1ffe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fff0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
20000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20040 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
20050 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
20060 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
20070 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
20080 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
20090 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
200a0 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
200b0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
200c0 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
200d0 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
20100 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
20110 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
20120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20130 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
20140 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
20150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
20160 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
20170 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20180 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
20190 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
201a0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
201b0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
201c0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
201d0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
201e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
201f0 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
20200 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
20210 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
20220 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
20230 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
20250 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
20260 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20270 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
20280 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
20290 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
202a0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
202b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
202c0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
202d0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
202e0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
202f0 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
20300 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
20310 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
20320 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
20330 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20340 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
20350 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20360 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
20370 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
20380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20390 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
203a0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
203b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
203c0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
203d0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
203e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
203f0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
20400 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
20430 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
20460 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
20490 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
204a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
204f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
20500 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
20510 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
20520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
20530 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
20540 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
20550 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20560 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
20570 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
20580 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66   object..*/..#if
20590 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
205a0 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  N__)./*.** Conve
205b0 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72  rt a filename fr
205c0 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20  om whatever the 
205d0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
205e0 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73  ting system.** s
205f0 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65  upports for file
20600 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38  names into UTF-8
20610 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
20620 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a   the result is.*
20630 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
20640 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
20650 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
20660 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
20670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
20680 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74   *winConvertToUt
20690 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
206a0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
206b0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76  ){.  char *zConv
206c0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
206d0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
206e0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
206f0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
20700 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
20710 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
20720 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
20730 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
20740 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
20750 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
20760 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
20770 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
20780 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
20790 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
207a0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
207b0 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ted;.}.#endif../
207c0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
207d0 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e  TF-8 filename in
207e0 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
207f0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
20800 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
20810 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61  tem wants filena
20820 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74  mes in.  Space t
20830 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
20840 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  t.** is obtained
20850 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
20860 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
20870 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
20880 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
20890 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f  atic void *winCo
208a0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
208b0 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
208c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
208d0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
208e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
208f0 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
20900 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38  verted = winUtf8
20910 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
20920 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
20930 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
20940 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
20950 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20960 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
20970 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
20980 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
20990 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
209a0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
209b0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
209c0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
209d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
209e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
209f0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
20a00 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73  pecified UTF-8 s
20a10 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20  tring buffer.** 
20a20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65  ends with a dire
20a30 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
20a40 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65  character or one
20a50 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
20a60 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74  y.** added to it
20a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20a80 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
20a90 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  ep(int nBuf, cha
20aa0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20  r *zBuf){.  if( 
20ab0 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  zBuf ){.    int 
20ac0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
20ad0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
20ae0 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a    if( nLen>0 ){.
20af0 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
20b00 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d  irSep(zBuf[nLen-
20b10 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  1]) ){.        r
20b20 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
20b30 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c  else if( nLen+1<
20b40 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
20b50 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e  zBuf[nLen] = win
20b60 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20  GetDirSep();.   
20b70 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31       zBuf[nLen+1
20b80 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
20b90 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
20ba0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
20bb0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20bc0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
20bd0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
20be0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
20bf0 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20  sulting pointer 
20c00 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54  into pzBuf..** T
20c10 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
20c20 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73  ned in pzBuf mus
20c30 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73  t be freed via s
20c40 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
20c50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20c60 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
20c70 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
20c80 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20  har **pzBuf){.  
20c90 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
20ca0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
20cb0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
20cc0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
20cd0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
20ce0 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
20cf0 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
20d00 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
20d10 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74  nPre = sqlite3St
20d20 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
20d30 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
20d40 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75  .  int nMax, nBu
20d50 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20  f, nDir, nLen;. 
20d60 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
20d70 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
20d80 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
20d90 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
20da0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
20db0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
20dc0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
20dd0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
20de0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
20df0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
20e00 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
20e10 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
20e20 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
20e30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
20e40 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20e50 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
20e60 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
20e70 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
20e80 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66  file.  ** name f
20e90 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
20ea0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20   file.  If this 
20eb0 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74  fails, we cannot
20ec0 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a   continue..  */.
20ed0 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d    nMax = pVfs->m
20ee0 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20  xPathname; nBuf 
20ef0 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42  = nMax + 2;.  zB
20f00 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  uf = sqlite3Mall
20f10 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a  ocZero( nBuf );.
20f20 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20    if( !zBuf ){. 
20f30 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
20f40 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
20f50 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20f60 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
20f70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
20f80 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
20f90 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
20fa0 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61  ffective tempora
20fb0 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46  ry directory.  F
20fc0 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f  irst, check if o
20fd0 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  ne.  ** has been
20fe0 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20   explicitly set 
20ff0 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
21000 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75  on; otherwise, u
21010 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20  se the one.  ** 
21020 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
21030 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
21040 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20  em..  */.  nDir 
21050 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b  = nMax - (nPre +
21060 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20   15);.  assert( 
21070 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  nDir>0 );.  if( 
21080 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21090 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
210a0 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69  t nDirLen = sqli
210b0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
210c0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
210d0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  ry);.    if( nDi
210e0 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  rLen>0 ){.      
210f0 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70  if( !winIsDirSep
21100 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
21110 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d  rectory[nDirLen-
21120 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  1]) ){.        n
21130 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  DirLen++;.      
21140 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72  }.      if( nDir
21150 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20  Len>nDir ){.    
21160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21170 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
21180 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21190 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
211a0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
211b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
211c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
211d0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
211e0 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b  tTempname1", 0);
211f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
21200 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21210 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
21220 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
21230 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
21240 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
21250 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
21260 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
21270 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
21280 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
21290 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51  0, /* getenv("SQ
212a0 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f  LITE_TMPDIR") */
212b0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
212c0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a  tenv("TMPDIR") *
212d0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
212e0 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a  etenv("TMP") */.
212f0 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21300 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20  env("TEMP") */. 
21310 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21320 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
21330 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61  ) */.       "/va
21340 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
21350 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
21360 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20    "/tmp",.      
21370 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20   ".",.       0  
21380 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
21390 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20  rminator */.    
213a0 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  };.    unsigned 
213b0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
213c0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
213d0 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ..    if( !azDir
213e0 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
213f0 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
21400 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  E_TMPDIR");.    
21410 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
21420 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
21430 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
21440 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32     if( !azDirs[2
21450 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
21460 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20  getenv("TMP");. 
21470 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33     if( !azDirs[3
21480 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20  ] ) azDirs[3] = 
21490 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a  getenv("TEMP");.
214a0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
214b0 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d  4] ) azDirs[4] =
214c0 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
214d0 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  FILE");.    for(
214e0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
214f0 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
21500 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
21510 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
21520 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
21530 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  ed;.      if( zD
21540 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
21550 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
21560 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  e path starts wi
21570 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
21580 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  r followed by th
21590 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a  e colon.      **
215a0 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75   character, assu
215b0 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  me it is already
215c0 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
215d0 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c  path; otherwise,
215e0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73  .      ** it mus
215f0 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
21600 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  o a native Win32
21610 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79   path via the Cy
21620 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a  gwin API.      *
21630 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67  * prior to using
21640 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
21650 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69      if( winIsDri
21660 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
21670 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
21680 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
21690 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
216a0 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b  8Filename(zDir);
216b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
216c0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
216d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
216e0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
216f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21700 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21710 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21720 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
21730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21740 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
21750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21760 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
21770 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
21780 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
21790 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
217a0 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
217b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
217c0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
217d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
217e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
217f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21800 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
21810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21820 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
21830 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
21840 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
21850 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
21860 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
21870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21880 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
21890 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
218a0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
218b0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
218c0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
218d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
218e0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
218f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21900 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
21910 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h(.             
21920 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43     osIsNT() ? CC
21930 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
21940 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
21950 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20  WIN_A, zDir,.   
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
21970 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29  nverted, nMax+1)
21980 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
21990 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
219a0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
219b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
219c0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
219d0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
219e0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
219f0 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
21a00 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  TH\n"));.       
21a10 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
21a20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21a30 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  RR_CONVPATH, (DW
21a40 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
21a70 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29  empname2", zDir)
21a80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21a90 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
21aa0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
21ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
21ac0 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
21ad0 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74  now the candidat
21ae0 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73  e directory exis
21af0 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ts and should.  
21b00 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73          ** be us
21b10 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65  ed.  However, we
21b20 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e   may need to con
21b30 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  vert the string 
21b40 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20  containing.     
21b50 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65       ** its name
21b60 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65   into UTF-8 (i.e
21b70 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31  . if it is UTF-1
21b80 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20  6 right now)..  
21b90 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21ba0 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
21bb0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
21bc0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e  tf8Filename(zCon
21bd0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21be0 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
21bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21c00 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21c10 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
21c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21c30 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21c40 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21c50 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21c60 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21c70 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
21c80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21c90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
21ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21cc0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
21cd0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
21ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21cf0 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
21d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21d10 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21d20 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
21d30 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21d40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21d50 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
21d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21d70 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
21d80 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
21d90 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
21da0 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e    else if( osIsN
21db0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
21dc0 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57  *zMulti;.    LPW
21dd0 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20  STR zWidePath = 
21de0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21df0 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57  o( nMax*sizeof(W
21e00 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28  CHAR) );.    if(
21e10 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20   !zWidePath ){. 
21e20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21e30 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
21e40 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21e50 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21e60 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21e70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21e80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21e90 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
21ea0 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  ( osGetTempPathW
21eb0 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68  (nMax, zWidePath
21ec0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
21ed0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
21ee0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
21ef0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21f00 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21f10 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21f20 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
21f30 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
21f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
21f50 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21f60 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
21f70 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
21f80 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21fa0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
21fb0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
21fc0 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63  zMulti = winUnic
21fd0 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
21fe0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
21ff0 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
22000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22010 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
22020 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
22030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75  sqlite3_free(zMu
22040 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
22050 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
22060 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  th);.    }else{.
22070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22080 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
22090 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
220a0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
220b0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
220c0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
220d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
220e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
220f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22100 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  EM;.    }.  }.#i
22110 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
22120 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
22130 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
22140 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  f8;.    char *zM
22150 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65  bcsPath = sqlite
22160 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
22170 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  x );.    if( !zM
22180 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20  bcsPath ){.     
22190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
221a0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
221b0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
221c0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
221d0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
221e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
221f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
22210 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61  GetTempPathA(nMa
22220 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30  x, zMbcsPath)==0
22230 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22240 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22250 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22260 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22270 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
22280 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
22290 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
222a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
222b0 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c  ERR_GETTEMPPATH,
222c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
222d0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
222e0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
222f0 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30  GetTempname3", 0
22300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  );.    }.    zUt
22310 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
22320 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
22330 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
22340 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
22350 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22360 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
22370 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
22380 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22390 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
223a0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
223b0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
223c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
223d0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
223e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
223f0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
22400 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22410 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
22420 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
22430 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
22440 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  SI */.#endif /* 
22450 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
22460 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   */..  /*.  ** C
22470 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
22480 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
22490 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77  directory ends w
224a0 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ith an appropria
224b0 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f  te.  ** separato
224c0 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  r.  If it does n
224d0 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ot and there is 
224e0 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65  not enough space
224f0 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a   left to add.  *
22500 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a  * one, fail..  *
22510 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65  /.  if( !winMake
22520 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72  EndInDirSep(nDir
22530 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20  +1, zBuf) ){.   
22540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22550 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  uf);.    OSTRACE
22560 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22570 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
22580 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
22590 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
225a0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
225b0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22  winGetTempname4"
225c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  , 0);.  }..  /*.
225d0 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20    ** Check that 
225e0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
225f0 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
22600 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
22610 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
22620 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ame in the follo
22630 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  wing format:.  *
22640 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f  *.  **   "<tempo
22650 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f  rary_directory>/
22660 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58  etilqs_XXXXXXXXX
22670 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a  XXXXXX\0\0".  **
22680 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65  .  ** If not, re
22690 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
226a0 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31  R.  The number 1
226b0 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69  7 is used here i
226c0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
226d0 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
226e0 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
226f0 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72  e 15 character r
22700 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64  andom suffix and
22710 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72   the.  ** two tr
22720 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61  ailing NUL chara
22730 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61  cters.  The fina
22740 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  l directory sepa
22750 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  rator character.
22760 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
22770 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73   added if it was
22780 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65   not already pre
22790 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65  sent..  */.  nLe
227a0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
227b0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28  n30(zBuf);.  if(
227c0 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20   (nLen + nPre + 
227d0 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20  17) > nBuf ){.  
227e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
227f0 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
22800 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22810 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
22820 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
22830 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22840 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
22850 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35  "winGetTempname5
22860 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ", 0);.  }..  sq
22870 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22880 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75  Buf-16-nLen, zBu
22890 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54  f+nLen, SQLITE_T
228a0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
228b0 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  ;..  j = sqlite3
228c0 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
228d0 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
228e0 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
228f0 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
22900 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
22910 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
22920 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
22930 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
22940 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
22950 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
22960 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
22970 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
22980 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a   *pzBuf = zBuf;.
22990 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
229a0 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d  P-FILENAME name=
229b0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %s, rc=SQLITE_OK
229c0 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
229d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
229e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
229f0 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
22a00 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
22a10 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
22a20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
22a30 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
22a40 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
22a50 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
22a60 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
22a70 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
22a80 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
22a90 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
22aa0 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
22ab0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
22ac0 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  d){.  DWORD attr
22ad0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
22ae0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
22af0 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  o;..  if( osIsNT
22b00 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
22b10 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
22b20 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
22b30 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
22b40 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
22b50 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
22b60 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
22b70 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
22b80 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
22b90 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
22ba0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
22bd0 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
22c00 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
22c10 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
22c20 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
22c30 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
22c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22c50 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
22c60 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
22c70 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
22c80 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
22c90 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
22ca0 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
22cb0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
22cc0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
22cd0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
22ce0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
22cf0 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
22d00 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
22d10 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
22d20 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
22d30 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
22d40 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
22d50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22d60 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
22d70 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
22d80 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
22d90 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74   get maximum pat
22da0 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f  h name length */
22db0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22dc0 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
22dd0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
22de0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
22df0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
22e00 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22e10 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
22e20 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
22e30 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
22e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22e50 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
22e60 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
22e70 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
22e80 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
22e90 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
22ea0 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
22eb0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
22ec0 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
22ed0 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
22ee0 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
22ef0 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
22f00 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
22f10 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
22f20 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
22f30 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
22f40 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
22f50 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
22f60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
22f70 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
22f80 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
22f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22fa0 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
22fb0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
22fc0 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
22fd0 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
22fe0 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
22ff0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
23000 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
23010 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
23020 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
23030 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
23040 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
23050 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
23060 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
23070 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
23080 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
23090 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
230a0 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20   char *zTmpname 
230b0 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70  = 0; /* For temp
230c0 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20  orary filename, 
230d0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  if necessary. */
230e0 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
230f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
23100 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
23110 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
23120 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
23130 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
23140 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
23150 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
23160 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
23170 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
23180 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
23190 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
231a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
231b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
231c0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
231d0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
231e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
231f0 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
23200 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
23210 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
23220 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
23230 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
23240 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23250 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
23260 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
23270 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
23280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23290 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
232a0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
232b0 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
232c0 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
232d0 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
232e0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
232f0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
23300 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23310 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
23320 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
23330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
23340 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
23350 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
23360 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
23370 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
23380 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
23390 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
233a0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
233b0 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
233c0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
233d0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
233e0 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
233f0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
23400 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
23410 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
23420 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
23430 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
23440 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
23450 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
23460 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
23470 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
23480 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
23490 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
234a0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
234b0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
234c0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
234d0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
234e0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
234f0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
23500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
23510 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
23520 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
23530 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
23540 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
23550 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
23560 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
23570 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
23580 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
23590 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
235a0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
235b0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
235c0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
235d0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
235e0 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
235f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
23600 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
23610 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
23620 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
23630 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
23640 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
23650 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
23660 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
23670 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
23680 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
23690 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
236a0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
236b0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
236c0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
236d0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
236e0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
236f0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23700 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
23710 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
23720 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
23730 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
23740 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
23750 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
23760 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
23770 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
23780 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
23790 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
237a0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
237b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
237c0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
237d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
237e0 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
237f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23800 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
23810 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23820 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
23830 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
23840 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23850 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
23860 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23870 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
23880 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
23890 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
238a0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
238b0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
238c0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
238d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
238e0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
238f0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
23900 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
23910 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
23920 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
23930 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
23940 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
23950 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65  e && !sqlite3_te
23960 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
23970 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
23980 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
23990 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
239a0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
239b0 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
239c0 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
239d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
239e0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
239f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
23a00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
23a10 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
23a20 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
23a30 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
23a40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
23a50 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
23a60 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
23a70 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
23a80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
23a90 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
23aa0 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
23ab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
23ad0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
23ae0 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
23af0 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
23b00 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
23b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23b20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
23b30 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
23b40 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
23b50 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
23b60 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
23b70 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
23b80 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
23b90 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
23ba0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
23bb0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
23bc0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
23bd0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
23be0 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
23bf0 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
23c00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
23c10 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
23c20 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
23c30 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
23c40 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
23c50 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
23c60 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
23c70 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
23c80 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
23c90 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
23ca0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
23cb0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
23cc0 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
23cd0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
23ce0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
23cf0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
23d00 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
23d10 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23d20 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
23d30 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
23d40 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23d50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23d60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
23d70 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
23d80 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
23d90 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
23da0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
23db0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
23dc0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
23dd0 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
23de0 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
23df0 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
23e00 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23e10 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
23e20 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
23e30 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
23e40 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
23e50 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
23e60 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
23e70 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
23e80 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
23e90 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
23ea0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
23eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
23ec0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
23ed0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
23ee0 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
23ef0 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
23f00 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
23f10 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
23f20 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
23f30 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
23f40 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
23f50 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
23f60 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
23f70 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
23f80 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
23f90 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
23fa0 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
23fb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
23fc0 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
23fd0 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
23fe0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
23ff0 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
24000 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
24010 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
24020 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
24030 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
24040 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
24050 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
24060 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
24070 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
24080 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
24090 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
240a0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
240b0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
240c0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
240d0 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
240e0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
240f0 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
24100 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
24110 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
24120 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
24130 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
24140 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24150 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24160 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
24170 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
24180 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
24190 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
241a0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
241b0 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
241e0 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
24210 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
24220 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
24230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
24240 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24250 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
24260 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
24270 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
24280 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
24290 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
242a0 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
242b0 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
242c0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
242d0 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
242e0 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
242f0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
24300 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
24310 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
24320 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24330 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
24340 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
24350 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24360 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
24370 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
24380 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
24390 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
243a0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
243b0 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
243c0 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
243d0 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
243e0 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
243f0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
24400 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
24410 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
24420 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
24430 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
24440 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
24450 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
24460 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
24470 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24480 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
24490 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
244a0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
244b0 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
244c0 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
244d0 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
244e0 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
244f0 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
24500 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
24510 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
24520 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
24530 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
24540 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
24550 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
24560 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
24590 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
245c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
245f0 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
24620 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
24630 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24640 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24660 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
24670 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
24680 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
24690 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
246a0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
246b0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
246c0 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
246d0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246f0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
24700 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
24730 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24750 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
24760 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24770 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
247a0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
247d0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
247e0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
24810 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
24820 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
24830 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
24840 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
24850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
24860 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
24870 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
24880 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
24890 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
248a0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248c0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
248d0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
24900 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
24930 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24950 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
24960 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
24970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
24990 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
249a0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
249d0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
249e0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a00 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
24a10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e    }.#endif.  win
24a20 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  LogIoerr(cnt);..
24a30 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24a40 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
24a50 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
24a60 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
24a70 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
24a80 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
24a90 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
24aa0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
24ab0 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
24ac0 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
24ad0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24ae0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
24af0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
24b00 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
24b10 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
24b20 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
24b30 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
24b40 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
24b50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24b60 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
24b70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24b80 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
24b90 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
24ba0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
24bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
24bc0 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
24bd0 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
24be0 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
24bf0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
24c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c10 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
24c20 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
24c30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24c40 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
24c50 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
24c60 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
24c70 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
24c80 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
24c90 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
24ca0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
24cb0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
24cc0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
24cd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24ce0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
24cf0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
24d00 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
24d10 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
24d20 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
24d30 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
24d40 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
24d50 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
24d60 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
24d70 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
24d80 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
24d90 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
24da0 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
24db0 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
24dc0 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
24dd0 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
24de0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24df0 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
24e00 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
24e10 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
24e20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
24e30 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
24e40 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
24e50 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
24e60 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
24e70 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
24e80 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
24e90 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
24ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24eb0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24ed0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
24ee0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d   OSTRACE(("OPEN-
24ef0 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c  CE-LOCK name=%s,
24f00 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65   rc=%s\n", zName
24f10 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
24f20 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75  (rc)));.    retu
24f30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
24f40 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
24f50 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
24f60 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
24f70 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
24f80 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
24f90 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24fa0 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
24fb0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
24fc0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
24fd0 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
24fe0 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
24ff0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
25000 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
25010 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
25020 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
25030 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
25040 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
25050 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
25060 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
25070 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
25080 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
25090 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
250a0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
250b0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  E_PSOW;.  }.  if
250c0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
250d0 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 6e 6f  olean(zName, "no
250e0 6c 6f 63 6b 22 2c 20 30 29 20 29 7b 0a 20 20 20  lock", 0) ){.   
250f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
25100 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 4e 4f 4c  s |= WINFILE_NOL
25110 4f 43 4b 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  OCK;.  }.  pFile
25120 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
25130 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
25140 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
25150 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
25160 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69  MAP_SIZE>0.  pFi
25170 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
25180 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  .  pFile->pMapRe
25190 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c  gion = 0;.  pFil
251a0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
251b0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
251c0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
251d0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
251e0 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
251f0 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
25200 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
25210 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
25220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25230 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
25240 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
25250 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
25260 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
25270 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
25280 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
25290 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
252a0 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
252b0 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
252c0 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
252d0 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
252e0 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
252f0 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
25300 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
25310 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
25320 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
25330 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
25340 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
25350 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
25360 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
25370 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
25380 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
25390 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
253a0 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
253b0 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
253c0 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
253d0 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
253e0 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
253f0 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
25400 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
25410 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
25420 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
25430 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
25440 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
25450 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
25460 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
25470 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
25480 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
25490 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
254a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
254b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
254c0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
254d0 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
254f0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
25500 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
25510 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
25520 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
25530 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
25540 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
25550 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
25560 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
25570 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
25580 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
25590 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
255a0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
255b0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
255c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
255d0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
255e0 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
255f0 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
25600 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
25610 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
25620 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
25630 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
25640 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
25650 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
25660 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
25670 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
25680 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
25690 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
256a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
256b0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
256c0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64  sIsNT() ){.    d
256d0 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
256e0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
256f0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
25700 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
25710 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
25720 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
25730 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
25740 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
25750 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
25760 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
25770 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
25780 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
257b0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
257c0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
257d0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
257e0 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
257f0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
25800 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
25810 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
25820 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
25830 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
25840 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
25850 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
25860 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
25870 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25880 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
25890 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
258a0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
258b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
258c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
258d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
258e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
258f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
25900 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
25910 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
25920 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
25930 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
25940 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
25950 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
25960 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
25970 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
25980 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
25990 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
259a0 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
259b0 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
259c0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
259d0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
259e0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
259f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
25a00 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
25a10 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
25a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
25a30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
25a40 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
25a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25a70 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
25a80 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
25a90 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
25aa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25ab0 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
25ac0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
25ad0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25ae0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
25af0 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
25b00 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
25b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25b20 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
25b30 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
25b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25b50 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
25b60 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
25b70 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
25b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
25b90 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
25ba0 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
25bb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25bc0 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
25bd0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
25be0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
25bf0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
25c00 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
25c10 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
25c20 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
25c30 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
25c40 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
25c50 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
25c60 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
25c70 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
25c80 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
25c90 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
25ca0 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
25cb0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
25cc0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
25cd0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
25ce0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25cf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
25d00 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
25d10 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
25d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25d30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25d40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
25d50 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
25d60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
25d70 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
25d80 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
25d90 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
25da0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25db0 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
25dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
25dd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
25de0 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
25df0 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
25e00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25e10 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
25e20 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
25e30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25e40 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
25e50 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
25e60 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
25e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25e80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
25e90 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
25ea0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
25eb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25ec0 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
25ed0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
25ee0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
25ef0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
25f00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
25f10 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25f20 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
25f30 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c  stErrno, "winDel
25f40 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
25f50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
25f60 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
25f70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
25f80 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
25f90 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
25fa0 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
25fb0 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
25fc0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
25fd0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
25fe0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
25ff0 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
26000 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
26010 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
26020 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
26030 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26040 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
26050 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
26060 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
26070 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
26080 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
26090 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
260a0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
260b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
260c0 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
260d0 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
260e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
260f0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
26100 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
26110 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
26120 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
26130 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
26140 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
26150 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
26160 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26170 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
26180 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
26190 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
261a0 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
261b0 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
261c0 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
261d0 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
261e0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
261f0 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
26200 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
26210 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
26220 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
26230 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
26240 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
26250 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
26260 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
26270 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
26280 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
26290 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
262a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
262b0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
262c0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
262d0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
262e0 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
262f0 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
26300 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
26310 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
26320 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
26330 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
26340 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
26350 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
26360 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
26370 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26390 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
263a0 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20  tandard, .      
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263c0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
263d0 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
263e0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
263f0 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
26400 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
26410 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
26420 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
26430 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
26440 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
26450 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
26460 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
26470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26480 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
26490 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
264a0 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
264b0 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
264c0 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20  zeHigh==0 .     
264d0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
264e0 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
264f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
26500 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
26510 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
26520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26530 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
26540 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
26550 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
26560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69   }else{.      wi
26570 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
26580 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
26590 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
265a0 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
265b0 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
265c0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
265d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
265e0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
265f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26600 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
26610 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
26620 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
26630 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20  nAccess",.      
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
26660 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26670 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
26680 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26690 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
266a0 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
266b0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
266c0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
266d0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
266e0 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
266f0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
26700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
26710 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
26720 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
26730 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
26740 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
26750 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
26760 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
26770 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
26780 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
26790 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
267a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
267b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
267c0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
267d0 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
267e0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
267f0 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
26800 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
26810 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
26820 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
26830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
26840 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
26850 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
26860 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
26870 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
26880 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28  = rc;.  OSTRACE(
26890 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
268a0 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70  , pResOut=%p, *p
268b0 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51  ResOut=%d, rc=SQ
268c0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
268d0 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
268e0 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
268f0 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
26900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26910 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
26920 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
26930 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
26940 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
26950 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f  ive letter.** fo
26960 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f  llowed by a colo
26970 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  n character..*/.
26980 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
26990 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
269a0 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  olon(.  const ch
269b0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
269c0 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69  .  return ( sqli
269d0 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68  te3Isalpha(zPath
269e0 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74  name[0]) && zPat
269f0 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b  hname[1]==':' );
26a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
26a10 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
26a20 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
26a30 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
26a40 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
26a50 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
26a60 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
26a70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
26a80 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
26a90 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
26aa0 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
26ab0 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
26ac0 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
26ad0 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
26ae0 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
26af0 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
26b00 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
26b10 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
26b20 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
26b30 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
26b40 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
26b50 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
26b60 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
26b70 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
26b80 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
26b90 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
26ba0 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
26bb0 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
26bc0 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
26bd0 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
26be0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
26bf0 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
26c00 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
26c10 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
26c20 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
26c30 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
26c40 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
26c50 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
26c60 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
26c70 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
26c80 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
26c90 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
26ca0 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
26cb0 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
26cc0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
26cd0 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
26ce0 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
26cf0 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
26d00 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d  sDirSep(zPathnam
26d10 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[0]) ){.    ret
26d20 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
26d30 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
26d40 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
26d50 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61   with a letter a
26d60 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73  nd a colon it is
26d70 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65   either a volume
26d80 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70  .  ** relative p
26d90 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  ath or an absolu
26da0 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72  te path.  Caller
26db0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
26dc0 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a  on must not.  **
26dd0 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61   attempt to trea
26de0 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69  t it as a relati
26df0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e  ve path name (i.
26e00 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73  e. they should s
26e10 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69  imply use.  ** i
26e20 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a  t verbatim)..  *
26e30 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72  /.  if ( winIsDr
26e40 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
26e50 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a  n(zPathname) ){.
26e60 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
26e70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
26e80 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69  If we get to thi
26e90 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74  s point, the pat
26ea0 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c  h name should al
26eb0 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62  most certainly b
26ec0 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20  e a purely.  ** 
26ed0 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e  relative one (i.
26ee0 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d  e. not a UNC nam
26ef0 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c  e, not absolute,
26f00 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20   and not volume 
26f10 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a  relative)..  */.
26f20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
26f30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
26f40 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
26f50 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
26f60 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
26f70 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
26f80 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
26f90 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
26fa0 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
26fb0 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
26fc0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
26fd0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
26fe0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
26ff0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27010 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
27020 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
27030 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
27040 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
27050 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
27060 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
27070 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
27080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
27090 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
270a0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
270b0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
270e0 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65   */.){.  .#if de
270f0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
27100 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
27110 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
27120 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
27130 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
27140 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Full);.  assert(
27150 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
27160 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
27170 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
27180 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
27190 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
271a0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
271b0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
271c0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
271d0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
271e0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
271f0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
27200 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
27210 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
27220 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
27230 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
27240 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
27250 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
27260 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27270 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
27280 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
27290 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
272a0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
272b0 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
272c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
272d0 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
272e0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
272f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
27300 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
27310 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27320 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27330 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
27340 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
27350 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
27360 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
27370 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
27380 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
27390 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20  IN_A) |.        
273a0 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45      CCP_RELATIVE
273b0 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  , zRelative, zOu
273c0 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t, pVfs->mxPathn
273d0 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  ame+1)<0 ){.    
273e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
273f0 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
27400 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
27410 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
27420 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
27430 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
27460 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
27470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27480 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
27490 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
274a0 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20  ilename(zOut);. 
274b0 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
274c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
274d0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
274e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
274f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27510 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
27520 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
27530 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
27540 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
27570 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
27580 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
27590 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
275a0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
275b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
275c0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
275d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
275e0 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
275f0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
27600 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
27610 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
27620 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
27630 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27640 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
27650 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
27660 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
27670 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
27680 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
27690 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
276a0 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20  _WIN_A),.       
276b0 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20       zRelative, 
276c0 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61  zOut, pVfs->mxPa
276d0 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20  thname+1)<0 ){. 
276e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
276f0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
27700 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
27710 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
27720 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  N_CONVPATH, (DWO
27730 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
27760 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
27770 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27780 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
27790 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
277a0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29  f8Filename(zOut)
277b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74  ;.      if( !zUt
277c0 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  f8 ){.        sq
277d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
277e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
277f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
27800 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
27810 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27820 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
27830 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
27840 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
27850 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
27860 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
27870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27880 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
27890 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
278a0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
278b0 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53  ..#if (SQLITE_OS
278c0 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
278d0 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64  _OS_WINRT) && !d
278e0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
278f0 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
27900 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
27910 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f  ITE_ERROR );.  /
27920 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
27930 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
27940 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
27950 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
27960 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61  */.  /* WinRT ha
27970 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76  s no way to conv
27980 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70  ert a relative p
27990 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ath to an absolu
279a0 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20  te one. */.  if 
279b0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
279c0 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
279d0 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
279e0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
279f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
27a00 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
27a10 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
27a20 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
27a30 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
27a40 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
27a50 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
27a60 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
27a70 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
27a80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
27a90 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
27aa0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27ab0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
27ac0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
27ad0 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
27ae0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
27af0 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
27b00 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
27b10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
27b20 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
27b30 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
27b40 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
27b70 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
27b80 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
27b90 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65  lative);.  }else
27ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
27bb0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
27bc0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27bd0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
27be0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27bf0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
27c00 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
27c10 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
27c20 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
27c30 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
27c40 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
27c50 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20   DWORD nByte;.  
27c60 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
27c70 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
27c80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
27c90 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
27ca0 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
27cb0 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
27cc0 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
27cd0 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
27ce0 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
27cf0 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
27d00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
27d10 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
27d20 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  & winIsDriveLett
27d30 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61  erAndColon(zRela
27d40 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a  tive+1) ){.    z
27d50 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
27d60 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
27d70 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
27d80 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
27d90 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
27da0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
27db0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
27dc0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
27dd0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
27de0 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
27df0 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
27e00 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
27e10 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
27e20 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
27e30 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
27e40 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
27e50 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
27e60 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
27e70 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
27e80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
27e90 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
27ea0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
27eb0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
27ec0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
27ed0 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
27ee0 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
27ef0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
27f00 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
27f10 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
27f20 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
27f30 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
27f40 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
27f50 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
27f60 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
27f70 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
27f80 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
27f90 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
27fa0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
27fb0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
27fc0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
27fd0 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
27fe0 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
27ff0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
28000 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
28010 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
28020 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
28030 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
28050 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
28060 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
28070 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  p(), zRelative);
28080 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28090 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f  TE_OK;.  }.  zCo
280a0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
280b0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
280c0 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
280d0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
280e0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
280f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28100 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
28110 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
28120 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20   LPWSTR zTemp;. 
28130 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
28140 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
28150 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
28160 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
28170 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
28180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28190 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
281a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
281b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
281c0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
281d0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
281e0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28200 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
28210 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
28220 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b     }.    nByte +
28230 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  = 3;.    zTemp =
28240 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
28250 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
28260 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
28270 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
28280 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28290 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
282a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
282b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
282c0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  M;.    }.    nBy
282d0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
282e0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
282f0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
28300 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
28310 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
28320 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28330 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28350 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28360 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
28370 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
28380 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
28390 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
283a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
283b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
283c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20  FullPathname2", 
283d0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
283e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
283f0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28400 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
28410 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
28420 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
28430 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
28440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
28450 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
28460 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
28470 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
28480 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
28490 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
284a0 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
284b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
284c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
284d0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
284e0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
284f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28500 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
28510 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
28520 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
28550 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69  hname3", zRelati
28560 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
28570 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
28580 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
28590 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
285a0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
285b0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
285c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
285d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
285e0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
285f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
28600 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
28610 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
28620 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
28630 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
28640 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
28650 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
28660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28670 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28680 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
28690 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
286a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
286b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
286c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
286d0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
286e0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
28710 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  4", zRelative);.
28720 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28730 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28740 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73  d);.    zOut = s
28750 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
28760 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
28770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28780 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
28790 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74  endif.  if( zOut
287a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
287b0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
287c0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
287d0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
287e0 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
287f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
28800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28810 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
28820 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28830 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
28840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
28850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28860 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
28870 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
28880 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
28890 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
288a0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
288b0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
288c0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
288d0 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
288e0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
288f0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
28900 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71  id *winDlOpen(sq
28910 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
28920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
28930 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c  lename){.  HANDL
28940 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  E h;.#if defined
28950 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69  (__CYGWIN__).  i
28960 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d  nt nFull = pVfs-
28970 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
28980 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73   char *zFull = s
28990 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
289a0 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69  ( nFull );.  voi
289b0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
289c0 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d  0;.  if( zFull==
289d0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
289e0 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
289f0 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
28a00 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
28a10 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75  d*)0));.    retu
28a20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
28a30 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
28a40 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
28a50 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d   nFull, zFull)!=
28a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28a70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
28a80 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ull);.    OSTRAC
28a90 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
28aa0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
28ab0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
28ac0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
28ad0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f  urn 0;.  }.  zCo
28ae0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
28af0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
28b00 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73  name(zFull);.  s
28b10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
28b20 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64  l);.#else.  void
28b30 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77   *zConverted = w
28b40 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
28b50 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
28b60 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
28b70 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
28b80 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f  #endif.  if( zCo
28b90 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
28ba0 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
28bb0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
28bc0 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
28bd0 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
28be0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
28bf0 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
28c00 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
28c10 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d  OS_WINRT.    h =
28c20 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
28c30 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29  ibrary((LPCWSTR)
28c40 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a  zConverted, 0);.
28c50 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73  #else.    h = os
28c60 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50  LoadLibraryW((LP
28c70 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28c80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
28c90 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
28ca0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
28cb0 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  e{.    h = osLoa
28cc0 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a  dLibraryA((char*
28cd0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
28ce0 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
28cf0 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
28d00 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
28d10 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
28d20 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69  oid*)h));.  sqli
28d30 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28d40 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
28d50 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
28d60 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
28d70 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
28d80 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
28d90 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
28da0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28db0 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65  R(pVfs);.  winGe
28dc0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
28dd0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
28de0 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
28df0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
28e00 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
28e10 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20  _vfs *pVfs,void 
28e20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  *pH,const char *
28e30 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
28e40 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20  FARPROC proc;.  
28e50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28e60 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d  (pVfs);.  proc =
28e70 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73   osGetProcAddres
28e80 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a  sA((HANDLE)pH, z
28e90 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Sym);.  OSTRACE(
28ea0 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25  ("DLSYM handle=%
28eb0 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64  p, symbol=%s, ad
28ec0 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  dress=%p\n",.   
28ed0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
28ee0 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29  H, zSym, (void*)
28ef0 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  proc));.  return
28f00 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
28f10 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  proc;.}.static v
28f20 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
28f30 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28f40 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
28f50 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28f60 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
28f70 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
28f80 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20  DLE)pHandle);.  
28f90 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53  OSTRACE(("DLCLOS
28fa0 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  E handle=%p\n", 
28fb0 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29  (void*)pHandle))
28fc0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
28fd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
28fe0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
28ff0 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
29000 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
29010 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
29020 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
29030 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
29040 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
29050 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
29060 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
29070 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
29080 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
29090 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
290a0 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
290b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
290c0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
290d0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
290e0 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
290f0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29100 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
29110 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d  LITE_TEST).  n =
29120 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28   nBuf;.  memset(
29130 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
29140 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
29150 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
29160 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
29170 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
29180 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
29190 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &x);.    memcpy(
291a0 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69  &zBuf[n], &x, si
291b0 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20  zeof(x));.    n 
291c0 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20  += sizeof(x);.  
291d0 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
291e0 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
291f0 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
29200 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
29210 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
29220 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29230 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
29240 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
29250 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66  of(pid);.  }.#if
29260 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
29270 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c  .  if( sizeof(UL
29280 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e  ONGLONG)<=nBuf-n
29290 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e   ){.    ULONGLON
292a0 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
292b0 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
292c0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
292d0 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
292e0 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
292f0 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
29300 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
29310 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
29320 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e   ){.    DWORD cn
29330 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
29340 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
29350 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
29360 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
29370 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
29380 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
29390 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
293a0 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
293b0 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
293c0 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
293d0 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
293e0 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20  ceCounter(&i);. 
293f0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
29400 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69  n], &i, sizeof(i
29410 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29420 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64  eof(i);.  }.#end
29430 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  if.  return n;.}
29440 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
29450 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
29460 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
29470 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
29480 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
29490 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69  nt winSleep(sqli
294a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
294b0 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20  nt microsec){.  
294c0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
294d0 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  eep((microsec+99
294e0 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53  9)/1000);.  UNUS
294f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29500 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d  s);.  return ((m
29510 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
29520 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  0)*1000;.}../*.*
29530 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
29540 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
29550 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
29560 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
29570 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
29580 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
29590 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
295a0 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
295b0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
295c0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
295d0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
295e0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
295f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
29600 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
29610 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
29620 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
29630 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
29640 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
29650 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
29660 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
29670 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
29680 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
29690 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
296a0 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
296b0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
296c0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
296d0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
296e0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
296f0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
29700 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
29710 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
29720 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
29730 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
29740 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
29750 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
29760 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
29770 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
29780 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
29790 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
297a0 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
297b0 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
297c0 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
297d0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
297e0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
297f0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
29800 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
29810 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
29820 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
29830 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
29840 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
29850 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
29860 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
29870 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
29880 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
29890 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30  ber of .     100
298a0 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
298b0 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
298c0 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
298d0 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20  D 2305813.5). . 
298e0 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
298f0 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
29900 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
29910 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
29920 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
29930 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
29940 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
29950 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
29960 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
29970 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
29980 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
29990 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
299a0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
299b0 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
299c0 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
299d0 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
299e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
299f0 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
29a00 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20  BitValue = .    
29a10 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
29a20 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
29a30 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
29a40 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20  0000000 +.      
29a50 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
29a60 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53  94967296;..#if S
29a70 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
29a80 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
29a90 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ;.  osGetSystemT
29aa0 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
29ab0 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
29ac0 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
29ad0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
29ae0 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53  o. */.  if (!osS
29af0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
29b00 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b  ime(&time,&ft)){
29b10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29b20 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
29b30 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
29b40 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
29b50 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a   &ft );.#endif..
29b60 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69    *piNow = winFi
29b70 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20  letimeEpoch +.  
29b80 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71            ((((sq
29b90 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
29ba0 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d  wHighDateTime)*m
29bb0 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20  ax32BitValue) + 
29bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29bd0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
29be0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
29bf0 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
29c00 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
29c10 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
29c20 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
29c30 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
29c40 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
29c50 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
29c60 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
29c70 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
29c80 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
29c90 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
29ca0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29cb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
29cc0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
29cd0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
29ce0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
29cf0 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
29d00 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
29d10 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
29d20 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
29d30 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
29d40 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
29d50 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
29d60 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
29d70 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
29d80 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
29d90 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
29da0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
29db0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
29dc0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
29dd0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
29de0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
29df0 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
29e00 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
29e10 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
29e20 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
29e30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29e40 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
29e50 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
29e60 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
29e70 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
29e80 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
29e90 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
29ea0 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
29eb0 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
29ec0 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
29ed0 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
29ee0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
29ef0 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
29f00 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
29f10 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
29f20 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
29f30 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
29f40 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
29f50 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
29f60 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
29f70 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
29f80 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
29f90 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
29fa0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
29fb0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
29fc0 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
29fd0 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
29fe0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
29ff0 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2a000 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2a010 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2a020 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2a030 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2a040 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2a050 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2a060 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2a070 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2a080 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2a090 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2a0a0 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2a0b0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2a0c0 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2a0d0 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2a0e0 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2a0f0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2a100 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2a110 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2a120 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2a130 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2a140 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2a150 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2a160 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2a170 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2a180 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2a190 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2a1a0 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2a1b0 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2a1c0 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2a1d0 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2a1e0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2a1f0 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2a200 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2a210 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2a220 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2a230 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2a240 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2a250 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2a260 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2a270 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2a280 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2a290 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2a2a0 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2a2b0 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2a2c0 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2a2d0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2a2e0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2a2f0 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2a300 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2a310 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2a320 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2a330 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2a340 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2a350 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2a360 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2a370 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2a380 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
2a390 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2a3a0 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61   return winGetLa
2a3b0 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
2a3c0 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
2a3d0 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
2a3e0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
2a3f0 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
2a400 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2a410 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
2a420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
2a430 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
2a440 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2a450 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
2a460 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2a470 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2a480 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2a490 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
2a4a0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2a4b0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2a4c0 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2a4d0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2a4e0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2a4f0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2a500 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a520 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2a550 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2a560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2a570 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2a580 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2a590 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2a5a0 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2a5b0 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
2a5c0 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
2a5d0 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
2a5e0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2a5f0 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2a610 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2a620 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2a630 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2a640 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2a650 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
2a660 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
2a670 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
2a680 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2a690 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2a6a0 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2a6b0 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2a6c0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2a6d0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2a6e0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2a6f0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2a700 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
2a710 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
2a720 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
2a730 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
2a740 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
2a750 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2a760 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2a770 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2a780 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2a790 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2a7a0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2a7b0 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
2a7c0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
2a7d0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
2a7e0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2a7f0 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66   */.  };.#if def
2a800 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2a810 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74  2_HAS_WIDE).  st
2a820 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2a830 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20   winLongPathVfs 
2a840 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a860 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2a870 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2a880 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2a890 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2a8a0 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59  INNT_MAX_PATH_BY
2a8b0 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2a8c0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8e0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2a8f0 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c  win32-longpath",
2a900 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2a910 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2a920 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2a930 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2a940 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2a950 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2a960 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2a970 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2a980 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2a990 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2a9a0 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2a9b0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2a9c0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2a9d0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2a9e0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2a9f0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2aa00 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2aa10 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2aa20 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2aa30 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2aa40 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2aa50 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2aa60 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2aa70 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2aa80 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2aa90 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2aaa0 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2aac0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2aad0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2aae0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2aaf0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2ab00 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2ab10 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2ab20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2ab30 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2ab40 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2ab50 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2ab60 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2ab70 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2ab80 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2ab90 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2aba0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2abb0 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2abc0 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2abd0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2abe0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75  #endif..  /* Dou
2abf0 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
2ac00 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
2ac10 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
2ac20 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
2ac30 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
2ac40 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
2ac50 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
2ac60 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2ac70 61 53 79 73 63 61 6c 6c 29 3d 3d 37 36 20 29 3b  aSyscall)==76 );
2ac80 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72  ..  /* get memor
2ac90 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e  y map allocation
2aca0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a   granularity */.
2acb0 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73    memset(&winSys
2acc0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
2acd0 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23  SYSTEM_INFO));.#
2ace0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2acf0 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65  RT.  osGetNative
2ad00 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2ad10 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  ysInfo);.#else. 
2ad20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
2ad30 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
2ad40 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
2ad50 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
2ad60 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
2ad70 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ty>0 );.  assert
2ad80 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  ( winSysInfo.dwP
2ad90 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20  ageSize>0 );..  
2ada0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
2adb0 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
2adc0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
2add0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2ade0 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f  WIDE).  sqlite3_
2adf0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
2ae00 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29  nLongPathVfs, 0)
2ae10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
2ae20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
2ae30 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
2ae40 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
2ae50 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2ae60 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21  .  if( sleepObj!
2ae70 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43  =NULL ){.    osC
2ae80 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
2ae90 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f  Obj);.    sleepO
2aea0 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23  bj = NULL;.  }.#
2aeb0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
2aec0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
2aed0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2aee0 5f 57 49 4e 20 2a 2f 0a                          _WIN */.