/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 59befa19fb087727c4817ad5f9db82c76bbd96c0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64  or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57  ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73  AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68   several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61  at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64  vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61  ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51  rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26  LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72  _OMIT_WAL).#  er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65  ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66  quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69  NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45  le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64  _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
06c0: 74 68 65 20 72 65 71 75 69 72 65 64 20 57 69 6e  the required Win
06d0: 64 6f 77 73 20 53 44 4b 20 76 65 72 73 69 6f 6e  dows SDK version
06e0: 20 63 6f 6e 73 74 61 6e 74 73 20 69 66 20 74 68   constants if th
06f0: 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c  ey are not.** al
0700: 72 65 61 64 79 20 61 76 61 69 6c 61 62 6c 65 2e  ready available.
0710: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 54 44 44  .*/.#ifndef NTDD
0720: 49 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65  I_WIN8.#  define
0730: 20 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20   NTDDI_WIN8     
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65     0x06020000.#e
0760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54  ndif..#ifndef NT
0770: 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 64  DDI_WINBLUE.#  d
0780: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 42  efine NTDDI_WINB
0790: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
07a0: 20 20 20 20 20 20 20 20 30 78 30 36 30 33 30 30          0x060300
07b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  00.#endif../*.**
07c0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 47 65   Check if the Ge
07d0: 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66  tVersionEx[AW] f
07e0: 75 6e 63 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  unctions should 
07f0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64 65  be considered de
0800: 70 72 65 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20  precated.** and 
0810: 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 6d  avoid using them
0820: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
0830: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74  It should be not
0840: 65 64 20 68 65 72 65 20 74 68 61 74 20 69 66 20  ed here that if 
0850: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
0860: 74 68 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  the SQLITE_WIN32
0870: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 70 72  _GETVERSIONEX pr
0880: 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
0890: 6f 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 77 68  o is zero.** (wh
08a0: 65 74 68 65 72 20 76 69 61 20 74 68 69 73 20 62  ether via this b
08b0: 6c 6f 63 6b 20 6f 72 20 76 69 61 20 62 65 69 6e  lock or via bein
08c0: 67 20 6d 61 6e 75 61 6c 6c 79 20 73 70 65 63 69  g manually speci
08d0: 66 69 65 64 29 2c 20 74 68 61 74 20 69 6d 70 6c  fied), that impl
08e0: 69 65 73 0a 2a 2a 20 74 68 65 20 75 6e 64 65 72  ies.** the under
08f0: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
0900: 73 79 73 74 65 6d 20 77 69 6c 6c 20 61 6c 77 61  system will alwa
0910: 79 73 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ys be based on t
0920: 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a  he Windows NT.**
0930: 20 4b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e   Kernel..*/.#ifn
0940: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
0950: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
0960: 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44   if defined(NTDD
0970: 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54  I_VERSION) && NT
0980: 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e  DDI_VERSION >= N
0990: 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20  TDDI_WINBLUE.#  
09a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
09b0: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
09c0: 45 58 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  EX   0.#  else.#
09d0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
09e0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
09f0: 4f 4e 45 58 20 20 20 31 0a 23 20 20 65 6e 64 69  ONEX   1.#  endi
0a00: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0a10: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0a20: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0a30: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0a40: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0a50: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
0a60: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
0a70: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
0aa0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
0ab0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0ac0: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0ad0: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0ae0: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0af0: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0b00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0b10: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0b20: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0b30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0b40: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0b50: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0b60: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0b70: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0b80: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0b90: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ba0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0bb0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0bc0: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0bd0: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0be0: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0bf0: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0c00: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0c10: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0c20: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0c30: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0c40: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0c50: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0c60: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0c80: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0c90: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0cb0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0cc0: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0cd0: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0ce0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0cf0: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0d00: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0d10: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0d20: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0d30: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0d40: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0d50: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0d60: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0d70: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0d80: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0d90: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0da0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0db0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0dc0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0dd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0de0: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0df0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0e00: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0e10: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0e20: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0e30: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0e40: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0e50: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0e60: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0e70: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0e80: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0ea0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0eb0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0ec0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0ed0: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_BYTES   \.   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
0f00: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0f10: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0f20: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0f30: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0f40: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0f50: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0f60: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0f70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0f80: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0f90: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0fa0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0fb0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0fd0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0fe0: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0ff0: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
1000: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
1010: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
1020: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
1030: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1040: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1060: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
1070: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1090: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
10a0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
10b0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
10c0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
10d0: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
10e0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
10f0: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1100: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1110: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1120: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1130: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1140: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1150: 45 5f 56 41 4c 55 45 28 78 29 20 28 76 6f 69 64  E_VALUE(x) (void
1160: 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )(x).#endif../*.
1170: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
1180: 68 61 72 61 63 74 65 72 20 74 68 61 74 20 73 68  haracter that sh
1190: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
11a0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
11b0: 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  parator..*/.#ifn
11c0: 64 65 66 20 77 69 6e 47 65 74 44 69 72 53 65 70  def winGetDirSep
11d0: 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65  .#  define winGe
11e0: 74 44 69 72 53 65 70 28 29 20 20 20 20 20 20 20  tDirSep()       
11f0: 20 20 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65           '\\'.#e
1200: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77  ndif../*.** Do w
1210: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c  e need to manual
1220: 6c 79 20 64 65 66 69 6e 65 20 74 68 65 20 57 69  ly define the Wi
1230: 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  n32 file mapping
1240: 20 41 50 49 73 20 66 6f 72 20 75 73 65 20 77 69   APIs for use wi
1250: 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28  th WAL.** mode (
1260: 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73 20  e.g. these APIs 
1270: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  are available in
1280: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 43 45 20   the Windows CE 
1290: 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74 68  SDK; however, th
12a0: 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 70 72  ey.** are not pr
12b0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65 61  esent in the hea
12c0: 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69  der file)?.*/.#i
12d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  f SQLITE_WIN32_F
12e0: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
12f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1300: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a  E_OMIT_WAL)./*.*
1310: 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 66 69 6c  * Two of the fil
1320: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 61  e mapping APIs a
1330: 72 65 20 64 69 66 66 65 72 65 6e 74 20 75 6e 64  re different und
1340: 65 72 20 57 69 6e 52 54 2e 20 20 46 69 67 75 72  er WinRT.  Figur
1350: 65 20 6f 75 74 20 77 68 69 63 68 0a 2a 2a 20 73  e out which.** s
1360: 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23  et we need..*/.#
1370: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1380: 52 54 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41  RT.WINBASEAPI HA
1390: 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61  NDLE WINAPI Crea
13a0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
13b0: 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  mApp(HANDLE, \. 
13c0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
13d0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 55 4c  Y_ATTRIBUTES, UL
13e0: 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 4c 50  ONG, ULONG64, LP
13f0: 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 41 53 45  CWSTR);..WINBASE
1400: 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50  API LPVOID WINAP
1410: 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  I MapViewOfFileF
1420: 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 55  romApp(HANDLE, U
1430: 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 53  LONG, ULONG64, S
1440: 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23 69  IZE_T);.#else.#i
1450: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1470: 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44  .WINBASEAPI HAND
1480: 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65  LE WINAPI Create
1490: 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 48 41 4e  FileMappingA(HAN
14a0: 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f  DLE, LPSECURITY_
14b0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
14c0: 20 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f        DWORD, DWO
14d0: 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 53 54  RD, DWORD, LPCST
14e0: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
14f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1500: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 2a 2f 0a  32_HAS_ANSI) */.
1510: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1520: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1530: 44 45 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  DE).WINBASEAPI H
1540: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
1550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1560: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
1570: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
1580: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
1590: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
15a0: 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f  CWSTR);.#endif /
15b0: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
15c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
15d0: 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 50 49 20   */..WINBASEAPI 
15e0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
15f0: 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e 44  pViewOfFile(HAND
1600: 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  LE, DWORD, DWORD
1610: 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54 29  , DWORD, SIZE_T)
1620: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1630: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
1640: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
1650: 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20 63  mapping API is c
1660: 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69  ommon to both Wi
1670: 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a  n32 and WinRT..*
1680: 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f  /.WINBASEAPI BOO
1690: 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56 69  L WINAPI UnmapVi
16a0: 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44  ewOfFile(LPCVOID
16b0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16c0: 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41  ITE_WIN32_FILEMA
16d0: 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65  PPING_API && !de
16e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16f0: 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_WAL) */../*.**
1700: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
1710: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
1720: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
1730: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
1740: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1750: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
1760: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1770: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
1780: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1790: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
17a0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
17b0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
17c0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
17d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17e0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
17f0: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
1800: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
1810: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
1820: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1840: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1850: 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63 74 75  ences to structu
1860: 72 65 73 20 75 73 65 64 20 66 6f 72 20 57 41 4c  res used for WAL
1870: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1880: 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d  ct winShm winShm
1890: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
18b0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
18c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
18d0: 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d  inShmNode winShm
18e0: 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67  Node;   /* A reg
18f0: 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ion of shared-me
1900: 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  mory */.#endif..
1910: 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b  /*.** WinCE lack
1920: 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74  s native support
1930: 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   for file lockin
1940: 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  g so we have to 
1950: 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  fake it.** with 
1960: 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72  some code of our
1970: 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   own..*/.#if SQL
1980: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70  ITE_OS_WINCE.typ
1990: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
19a0: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
19b0: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
19c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
19d0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
19e0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
19f0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
1a00: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
1a10: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1a20: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1a30: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
1a40: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1a50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
1a60: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
1a70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
1a80: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
1a90: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
1aa0: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
1ab0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
1ac0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
1ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
1ae0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1af0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
1b00: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
1b10: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
1b20: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
1b30: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
1b40: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
1b50: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
1b60: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
1b70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b80: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
1b90: 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66  ; /*** Must be f
1ba0: 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69  irst ***/.  sqli
1bb0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1bc0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75      /* The VFS u
1bd0: 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73  sed to open this
1be0: 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c   file */.  HANDL
1bf0: 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  E h;            
1c00: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
1c10: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 66   accessing the f
1c20: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b  ile */.  u8 lock
1c30: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
1c40: 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
1c50: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1c60: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1c70: 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f    short sharedLo
1c80: 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e  ckByte;   /* Ran
1c90: 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74  domly chosen byt
1ca0: 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61 72  e used as a shar
1cb0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  ed lock */.  u8 
1cc0: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1cd0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20       /* Flags.  
1ce0: 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65  See WINFILE_* be
1cf0: 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  low */.  DWORD l
1d00: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1d10: 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1d20: 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1d30: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1d40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d50: 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68  OMIT_WAL.  winSh
1d60: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1d70: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
1d80: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
1d90: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1da0: 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63  #endif.  const c
1db0: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1dc0: 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d   /* Full pathnam
1dd0: 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a  e of this file *
1de0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e00: 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67  hunk size config
1e10: 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48  ured by FCNTL_CH
1e20: 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20  UNK_SIZE */.#if 
1e30: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1e40: 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65    LPWSTR zDelete
1e50: 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d  OnClose;  /* Nam
1e60: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
1e70: 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  ete when closing
1e80: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75   */.  HANDLE hMu
1e90: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tex;          /*
1ea0: 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20 63   Mutex used to c
1eb0: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
1ec0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20   shared lock */ 
1ed0: 20 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72   .  HANDLE hShar
1ee0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ed;         /* S
1ef0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
1f00: 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f  ment used for lo
1f10: 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  cking */.  wince
1f20: 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20  Lock local;     
1f30: 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61     /* Locks obta
1f40: 69 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e 73  ined by this ins
1f50: 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65  tance of winFile
1f60: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f70: 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a  *shared;      /*
1f80: 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c   Global shared l
1f90: 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ock memory for t
1fa0: 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64  he file  */.#end
1fb0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
1fc0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1fd0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
2000: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
2010: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41  ferences */.  HA
2020: 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2040: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
2050: 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  ing memory mappi
2060: 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ng */.  void *pM
2070: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
2080: 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65        /* Area me
2090: 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
20a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
20b0: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  mapSize;       /
20c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
20d0: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
20e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
20f0: 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  4 mmapSizeActual
2100: 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65  ; /* Actual size
2110: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
2120: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
2130: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
2140: 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
2150: 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  ed FCNTL_MMAP_SI
2160: 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  ZE value */.#end
2170: 69 66 0a 20 20 53 51 4c 69 74 65 54 68 72 65 61  if.  SQLiteThrea
2180: 64 20 2a 70 72 65 43 61 63 68 65 54 68 72 65 61  d *preCacheThrea
2190: 64 3b 20 2f 2a 20 54 68 72 65 61 64 20 75 73 65  d; /* Thread use
21a0: 64 20 74 6f 20 70 72 65 2d 63 61 63 68 65 20 66  d to pre-cache f
21b0: 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  ile contents */.
21c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
21d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e  d values for win
21e0: 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a  File.ctrlFlags.*
21f0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
2200: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20  E_RDONLY        
2210: 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e    0x02   /* Conn
2220: 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f  ection is read o
2230: 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  nly */.#define W
2240: 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
2250: 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  AL     0x04   /*
2260: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2270: 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  mode */.#define 
2280: 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20  WINFILE_PSOW    
2290: 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f          0x10   /
22a0: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
22b0: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
22c0: 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65  TE */../*. * The
22d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
22e0: 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69  fer used by sqli
22f0: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
2300: 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66  debug().. */.#if
2310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2320: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23  2_DBG_BUF_SIZE.#
2330: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2340: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
2350: 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36  ZE   ((int)(4096
2360: 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29  -sizeof(DWORD)))
2370: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2380: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69  he value used wi
2390: 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  th sqlite3_win32
23a0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29  _set_directory()
23b0: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74   to specify that
23c0: 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72  . * the data dir
23d0: 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  ectory should be
23e0: 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69   changed.. */.#i
23f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2400: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
2410: 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65  Y_TYPE.#  define
2420: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41   SQLITE_WIN32_DA
2430: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
2440: 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  E (1).#endif../*
2450: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2460: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2470: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
2480: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
2490: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d   that. * the tem
24a0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
24b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
24c0: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
24d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
24e0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
24f0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2500: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
2510: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a  ECTORY_TYPE (2).
2520: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66  #endif../*. * If
2530: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
2540: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
2550: 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  OC on Windows, w
2560: 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20  e will use the. 
2570: 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20  * various Win32 
2580: 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f  API heap functio
2590: 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75  ns instead of ou
25a0: 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65  r own.. */.#ifde
25b0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
25c0: 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20  ALLOC../*. * If 
25d0: 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  this is non-zero
25e0: 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65  , an isolated he
25f0: 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  ap will be creat
2600: 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65  ed by the native
2610: 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61   Win32. * alloca
2620: 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f  tor subsystem; o
2630: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65  therwise, the de
2640: 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65  fault process he
2650: 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  ap will be used.
2660: 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e    This. * settin
2670: 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  g has no effect 
2680: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66  when compiling f
2690: 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65  or WinRT.  By de
26a0: 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65  fault, this is e
26b0: 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e  nabled. * and an
26c0: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
26d0: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74  ill be created t
26e0: 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f  o store all allo
26f0: 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20  cated data.. *. 
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2750: 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73  * WARNING: It is
2760: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
2770: 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
2780: 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e  s setting is non
2790: 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a  -zero and the. *
27a0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d            winMem
27b0: 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  Shutdown functio
27c0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67  n is called (e.g
27d0: 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  . by the sqlite3
27e0: 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20  _shutdown. *    
27f0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c        function),
2800: 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77   all data that w
2810: 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  as allocated usi
2820: 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  ng the isolated 
2830: 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20  heap will. *    
2840: 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69        be freed i
2850: 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61  mmediately and a
2860: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  ny attempt to ac
2870: 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74  cess any of that
2880: 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20   freed. *       
2890: 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d     data will alm
28a0: 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65  ost certainly re
28b0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64  sult in an immed
28c0: 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c  iate access viol
28d0: 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ation.. ********
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64  ******. */.#ifnd
2930: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2940: 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64  HEAP_CREATE.#  d
2950: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2960: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20  32_HEAP_CREATE  
2970: 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a    (TRUE).#endif.
2980: 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69  ./*. * The initi
2990: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  al size of the W
29a0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65  in32-specific he
29b0: 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ap.  This value 
29c0: 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f  may be zero.. */
29d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29e0: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
29f0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
2a00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2a10: 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c  _INIT_SIZE ((SQL
2a20: 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
2a30: 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20  E_SIZE) * \.    
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55     (SQLITE_DEFAU
2a70: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20  LT_PAGE_SIZE) + 
2a80: 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a  4194304).#endif.
2a90: 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d  ./*. * The maxim
2aa0: 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57  um size of the W
2ab0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65  in32-specific he
2ac0: 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ap.  This value 
2ad0: 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f  may be zero.. */
2ae0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2af0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
2b00: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
2b10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2b20: 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65  MAX_SIZE  (0).#e
2b30: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2b40: 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75  extra flags to u
2b50: 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74  se in calls to t
2b60: 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50  he Win32 heap AP
2b70: 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  Is.  This value 
2b80: 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66  may be. * zero f
2b90: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62  or the default b
2ba0: 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66  ehavior.. */.#if
2bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2bc0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20  2_HEAP_FLAGS.#  
2bd0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2be0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20  N32_HEAP_FLAGS  
2bf0: 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a     (0).#endif...
2c00: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d  /*.** The winMem
2c10: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73  Data structure s
2c20: 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tores informatio
2c30: 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  n required by th
2c40: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2c50: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  .** sqlite3_mem_
2c60: 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e  methods implemen
2c70: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
2c80: 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ef struct winMem
2c90: 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b  Data winMemData;
2ca0: 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61  .struct winMemDa
2cb0: 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ta {.#ifndef NDE
2cc0: 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31  BUG.  u32 magic1
2cd0: 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d  ;   /* Magic num
2ce0: 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74  ber to detect st
2cf0: 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69  ructure corrupti
2d00: 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  on. */.#endif.  
2d10: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a  HANDLE hHeap; /*
2d20: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f   The handle to o
2d30: 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f  ur heap. */.  BO
2d40: 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44  OL bOwned;  /* D
2d50: 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61  o we own the hea
2d60: 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20  p (i.e. destroy 
2d70: 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f  it on shutdown)?
2d80: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
2d90: 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b  UG.  u32 magic2;
2da0: 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62     /* Magic numb
2db0: 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72  er to detect str
2dc0: 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
2dd0: 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  n. */.#endif.};.
2de0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2df0: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
2e00: 41 47 49 43 31 20 20 20 20 20 30 78 34 32 62 32  AGIC1     0x42b2
2e10: 38 33 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e  830b.#define WIN
2e20: 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30  MEM_MAGIC2     0
2e30: 78 62 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66  xbd4d7cf4.#endif
2e40: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
2e50: 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d  winMemData win_m
2e60: 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e  em_data = {.#ifn
2e70: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e  def NDEBUG.  WIN
2e80: 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64  MEM_MAGIC1,.#end
2e90: 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45  if.  NULL, FALSE
2ea0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2eb0: 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32    ,WINMEM_MAGIC2
2ec0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e  .#endif.};..#ifn
2ed0: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
2ee0: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
2ef0: 61 67 69 63 31 28 29 20 61 73 73 65 72 74 28 20  agic1() assert( 
2f00: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67  win_mem_data.mag
2f10: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
2f20: 43 31 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e  C1 ).#define win
2f30: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28  MemAssertMagic2(
2f40: 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65  ) assert( win_me
2f50: 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57  m_data.magic2==W
2f60: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23  INMEM_MAGIC2 ).#
2f70: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
2f80: 65 72 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d  ertMagic()  winM
2f90: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29  emAssertMagic1()
2fa0: 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  ; winMemAssertMa
2fb0: 67 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64  gic2();.#else.#d
2fc0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2fd0: 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66  rtMagic().#endif
2fe0: 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ..#define winMem
2ff0: 47 65 74 44 61 74 61 50 74 72 28 29 20 20 26 77  GetDataPtr()  &w
3000: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66  in_mem_data.#def
3010: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  ine winMemGetHea
3020: 70 28 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f  p()     win_mem_
3030: 64 61 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69  data.hHeap.#defi
3040: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  ne winMemGetOwne
3050: 64 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64  d()    win_mem_d
3060: 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74  ata.bOwned..stat
3070: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
3080: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
3090: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
30a0: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
30b0: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
30c0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
30d0: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
30e0: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
30f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
3100: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
3110: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
3120: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
3130: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
3140: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
3150: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
3160: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
3170: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
3180: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
3190: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
31a0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
31b0: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
31c0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
31d0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
31e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
31f0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
3200: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
3210: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
3220: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
3230: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
3240: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
3250: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3260: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
3270: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
3280: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
3290: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
32a0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
32b0: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
32c0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
32d0: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
32e0: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
32f0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
3300: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
3310: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
3320: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
3330: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
3340: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
3350: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
3360: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3370: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3380: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
3390: 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
33a0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
33b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c  TE_OS_WINRT && \
33c0: 0a 20 20 20 20 20 20 64 65 66 69 6e 65 64 28 53  .      defined(S
33d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
33e0: 41 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64  ANSI) && defined
33f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3400: 53 5f 57 49 44 45 29 0a 73 74 61 74 69 63 20 69  S_WIDE).static i
3410: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
3420: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
3430: 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a  #ifndef SYSCALL.
3440: 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c  #  define SYSCAL
3450: 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  L sqlite3_syscal
3460: 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a  l_ptr.#endif../*
3470: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3480: 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  n is not availab
3490: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
34a0: 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a   or WinRT.. */..
34b0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
34c0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
34d0: 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65  _WINRT.#  define
34e0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
34f0: 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e  SI()       1.#en
3500: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20  dif../*.** Many 
3510: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65  system calls are
3520: 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67   accessed throug
3530: 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e  h pointer-to-fun
3540: 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a  ctions so that.*
3550: 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76  * they may be ov
3560: 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74  erridden at runt
3570: 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ime to facilitat
3580: 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f  e fault injectio
3590: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  n during.** test
35a0: 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69  ing and sandboxi
35b0: 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ng.  The followi
35c0: 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74  ng array holds t
35d0: 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69  he names and poi
35e0: 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20  nters.** to all 
35f0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
3600: 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74  tem calls..*/.st
3610: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f  atic struct win_
3620: 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73  syscall {.  cons
3630: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
3640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3650: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
3660: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
3670: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43  3_syscall_ptr pC
3680: 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65  urrent; /* Curre
3690: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
36a0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20  system call */. 
36b0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
36c0: 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f  _ptr pDefault; /
36d0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
36e0: 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20  */.} aSyscall[] 
36f0: 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  = {.#if !SQLITE_
3700: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
3710: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
3720: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
3730: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
3740: 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73  CALL)AreFileApis
3750: 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20  ANSI,         0 
3760: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72  },.#else.  { "Ar
3770: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
3780: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3790: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
37a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
37b0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
37c0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
37d0: 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69  .#define osAreFi
37e0: 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f  leApisANSI ((BOO
37f0: 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  L(WINAPI*)(VOID)
3800: 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75  )aSyscall[0].pCu
3810: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
3820: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3830: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
3840: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3850: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f  IDE).  { "CharLo
3860: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
3870: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
3880: 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20  rLowerW,        
3890: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
38a0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
38b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
38c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
38f0: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77  define osCharLow
3900: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
3910: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
3920: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
3930: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3940: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
3950: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3960: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3970: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
3980: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3990: 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20  LL)CharUpperW,  
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
39b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
39c0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
39d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
39e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
39f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3a00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3a10: 68 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53  harUpperW ((LPWS
3a20: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
3a30: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e  TR))aSyscall[2].
3a40: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3a50: 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20  CloseHandle",   
3a60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3a70: 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20  LL)CloseHandle, 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3a90: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73  ..#define osClos
3aa0: 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57  eHandle ((BOOL(W
3ab0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
3ac0: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
3ad0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3ae0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3af0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43  HAS_ANSI).  { "C
3b00: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
3b10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3b20: 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20  L)CreateFileA,  
3b30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3b40: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3b50: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
3b60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3b90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3ba0: 65 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44  eateFileA ((HAND
3bb0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
3bc0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  TR,DWORD,DWORD, 
3bd0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
3be0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
3bf0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44  DWORD,DWORD,HAND
3c00: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  LE))aSyscall[4].
3c10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c20: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3c30: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3c40: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3c50: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3c60: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3c70: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3c80: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
3c90: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3ca0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3cc0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3ce0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3cf0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3d00: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
3d10: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
3d20: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
3d30: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
3d40: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
3d50: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
3d60: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
3d70: 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45  t)..#if (!SQLITE
3d80: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
3d90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3da0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c  2_HAS_ANSI) && \
3db0: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
3dc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3dd0: 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  L)).  { "CreateF
3de0: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
3df0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3e00: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20  teFileMappingA, 
3e10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3e20: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
3e30: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
3e40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3e70: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
3e80: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e  leMappingA ((HAN
3e90: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
3ea0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
3eb0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
3ec0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
3ed0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61  ,DWORD,LPCSTR))a
3ee0: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
3ef0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3f00: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
3f10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3f20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3f30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3f40: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
3f50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3f60: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72  IT_WAL)).  { "Cr
3f70: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3f80: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3f90: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
3fa0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
3fb0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3fc0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
3fd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4000: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
4010: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
4020: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4030: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
4040: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
4050: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
4060: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
4070: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
4080: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4090: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
40a0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
40b0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
40c0: 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  E).  { "CreateMu
40d0: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
40e0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
40f0: 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20  eMutexW,        
4100: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4110: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4120: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4130: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4160: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74  fine osCreateMut
4170: 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  exW ((HANDLE(WIN
4180: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
4190: 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c  _ATTRIBUTES,BOOL
41a0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57  , \.        LPCW
41b0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  STR))aSyscall[8]
41c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
41d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
41e0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
41f0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
4200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4210: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
4220: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
4230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4240: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4290: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28   osDeleteFileA (
42a0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
42b0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
42c0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
42d0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
42e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
42f0: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
4300: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
4310: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4320: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
4330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4340: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4390: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57  ne osDeleteFileW
43a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
43b0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
43c0: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
43d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
43e0: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
43f0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
4400: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69  me", (SYSCALL)Fi
4410: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
4420: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
4430: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
4440: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4450: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4480: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
4490: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
44a0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
44b0: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
44c0: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
44d0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
44e0: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
44f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4500: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4510: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
4520: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c      (SYSCALL)Fil
4530: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4540: 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  e,    0 },.#else
4550: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4560: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4570: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
45a0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
45b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28  eToSystemTime ((
45c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
45d0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
45e0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
45f0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
4600: 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  12].pCurrent).. 
4610: 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66   { "FlushFileBuf
4620: 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53  fers",        (S
4630: 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65  YSCALL)FlushFile
4640: 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20  Buffers,        
4650: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4660: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
4670: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4680: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
4690: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
46a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
46b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
46c0: 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  SI).  { "FormatM
46d0: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
46e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
46f0: 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20  atMessageA,     
4700: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4710: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4720: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
4730: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4760: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
4770: 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57  ssageA ((DWORD(W
4780: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4790: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
47a0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
47b0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
47c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  *))aSyscall[14].
47d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
47e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
47f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4800: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
4810: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
4820: 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73  SCALL)FormatMess
4830: 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30  ageW,          0
4840: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4850: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
4860: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4870: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4880: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4890: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
48a0: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
48b0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
48c0: 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c  )(DWORD,LPCVOID,
48d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53  DWORD,DWORD,LPWS
48e0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
48f0: 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53  ORD,va_list*))aS
4900: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
4910: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4920: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
4930: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
4940: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
4950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4960: 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61  YSCALL)FreeLibra
4970: 72 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ry,             
4980: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4990: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
49a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
49b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
49d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
49e0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
49f0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4a00: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
4a10: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
4a20: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
4a30: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
4a40: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
4a50: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
4a60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4a70: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
4a80: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
4a90: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
4aa0: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
4ab0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4ac0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4ad0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4ae0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4af0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4b00: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
4b10: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
4b20: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
4b30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
4b40: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
4b50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4b90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4ba0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4bb0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
4bc0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4bd0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4be0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
4bf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4c00: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4c10: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
4c20: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4c30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4c40: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
4c50: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
4c60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4c70: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c80: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
4c90: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
4ca0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
4cb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4ce0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
4cf0: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
4d00: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4d10: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
4d20: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
4d30: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
4d40: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
4d50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4d60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4d70: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4d80: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4d90: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
4da0: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
4db0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
4dc0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4dd0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
4de0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4df0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4e00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4e20: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4e30: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
4e40: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4e50: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
4e60: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4e70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4e80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4e90: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4ea0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4eb0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4ec0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4ed0: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
4ee0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4ef0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
4f00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4f30: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4f40: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f50: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4f60: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4f70: 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e  call[21].pCurren
4f80: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4f90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4fa0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
4fb0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4fc0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
4fd0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4fe0: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
4ff0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
5000: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5010: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5040: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5050: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
5060: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5070: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
5080: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
5090: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
50a0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
50b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
50c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
50d0: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
50e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
50f0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
5100: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5110: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5120: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5130: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5140: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5150: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5160: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5170: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
5180: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5190: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
51a0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
51b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
51c0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
51d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
51e0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
51f0: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5200: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
5210: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
5220: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
5230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5240: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5250: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5290: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
52a0: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
52b0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
52c0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
52d0: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
52e0: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
52f0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5300: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
5310: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5320: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5330: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
5340: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5350: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
5360: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
5370: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
5380: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5390: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
53a0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
53b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
53c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
53d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
53e0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
53f0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
5400: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
5410: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
5420: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
5430: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
5440: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
5450: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
5460: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5470: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
5480: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5490: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
54a0: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
54b0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
54c0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
54d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
54e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
54f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53  EXTENSION).#if S
5500: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5510: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
5520: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
5530: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
5540: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
5550: 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  E. */.  { "GetPr
5560: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
5570: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5580: 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20  tProcAddressA,  
5590: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
55a0: 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
55b0: 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   Windows platfor
55c0: 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
55d0: 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
55e0: 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20  ke.  ** an ANSI 
55f0: 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
5600: 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
5610: 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b  E setting */.  {
5620: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5630: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5640: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
5650: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20  ess,          0 
5660: 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  },.#endif.#else.
5670: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5680: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5690: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
56c0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
56d0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
56e0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
56f0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
5700: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
5710: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
5720: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5730: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
5740: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
5750: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
5760: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
5770: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5780: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
5790: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
57a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
57d0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
57e0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
57f0: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
5800: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d  FO))aSyscall[28]
5810: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5820: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
5830: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5840: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
5850: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
5860: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
5870: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
5880: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
5890: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
58a0: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
58b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
58c0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
58d0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
58e0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
58f0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5900: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
5910: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5920: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
5930: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5960: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5970: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5980: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
5990: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
59a0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
59b0: 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[30].pCurrent).
59c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
59e0: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
59f0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
5a00: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5a10: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
5a20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a30: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5a40: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
5a50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a80: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5a90: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
5aa0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
5ab0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e  R))aSyscall[31].
5ac0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5ad0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5ae0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5af0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5b00: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
5b10: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
5b20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
5b30: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
5b40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5b50: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
5b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5b70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5ba0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
5bb0: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
5bc0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
5bd0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70  ))aSyscall[32].p
5be0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5bf0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5c00: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
5c10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5c20: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
5c30: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
5c40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5c50: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
5c60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5c70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5c90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5ca0: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
5cb0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cc0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5cd0: 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  33].pCurrent)..#
5ce0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5cf0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5d00: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5d10: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5d20: 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20  SIONEX) && \.   
5d30: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
5d40: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20  2_GETVERSIONEX. 
5d50: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
5d60: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
5d70: 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f  YSCALL)GetVersio
5d80: 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20  nExA,           
5d90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5da0: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
5db0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5dc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5de0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5df0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
5e00: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5e10: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53  ( \.        LPOS
5e20: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53  VERSIONINFOA))aS
5e30: 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72  yscall[34].pCurr
5e40: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5e50: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5e60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5e70: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
5e80: 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  \.        define
5e90: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
5ea0: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20  ETVERSIONEX) && 
5eb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5ec0: 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47  VERSIONEX.  { "G
5ed0: 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20  etVersionExW",  
5ee0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ef0: 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c  L)GetVersionExW,
5f00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5f10: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65  #else.  { "GetVe
5f20: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
5f30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5f60: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5f70: 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f  tVersionExW ((BO
5f80: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5f90: 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49         LPOSVERSI
5fa0: 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c  ONINFOW))aSyscal
5fb0: 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[35].pCurrent).
5fc0: 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22  .  { "HeapAlloc"
5fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fe0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c  (SYSCALL)HeapAll
5ff0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6000: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6010: 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50  osHeapAlloc ((LP
6020: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
6030: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
6040: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6050: 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72  yscall[36].pCurr
6060: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6070: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6080: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
6090: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
60a0: 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20  LL)HeapCreate,  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
60c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
60d0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
60e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
60f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6100: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6110: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6120: 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44  eapCreate ((HAND
6130: 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  LE(WINAPI*)(DWOR
6140: 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20  D,SIZE_T, \.    
6150: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6160: 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e  call[37].pCurren
6170: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6180: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6190: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
61a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
61b0: 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20  )HeapDestroy,   
61c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
61d0: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65  else.  { "HeapDe
61e0: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
61f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6220: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
6230: 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28  pDestroy ((BOOL(
6240: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
6250: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
6260: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
6270: 61 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  apFree",        
6280: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6290: 29 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20  )HeapFree,      
62a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
62b0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72  #define osHeapFr
62c0: 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ee ((BOOL(WINAPI
62d0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
62e0: 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  LPVOID))aSyscall
62f0: 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [39].pCurrent)..
6300: 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63    { "HeapReAlloc
6310: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c  SYSCALL)HeapReAl
6330: 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  loc,            
6340: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6350: 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c  sHeapReAlloc ((L
6360: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6370: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
6380: 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  ID, \.        SI
6390: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
63a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
63b0: 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20  { "HeapSize",   
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
63d0: 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20  SCALL)HeapSize, 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
63f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
6400: 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54  eapSize ((SIZE_T
6410: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6420: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6430: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
6440: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
6450: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6460: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6470: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
6480: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6490: 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20  HeapValidate,   
64a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
64b0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  lse.  { "HeapVal
64c0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
64d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6500: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6510: 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28  Validate ((BOOL(
6520: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6530: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6540: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6550: 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[42].pCurrent)
6560: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6570: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6580: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6590: 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20  HeapCompact",   
65a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65b0: 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  LL)HeapCompact, 
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
65d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
65e0: 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20  Compact",       
65f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6610: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6620: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6630: 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e  eapCompact ((UIN
6640: 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  T(WINAPI*)(HANDL
6650: 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  E,DWORD))aSyscal
6660: 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[43].pCurrent).
6670: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6680: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6690: 53 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  SI) && !defined(
66a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
66b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
66c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
66d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
66e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
66f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6700: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6710: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
6720: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6730: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6740: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6750: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6760: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
6770: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6780: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
6790: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
67a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
67b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
67c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
67d0: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
67e0: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
67f0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
6800: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6810: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
6820: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6830: 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20  )LoadLibraryW,  
6840: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6850: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6860: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6870: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
68a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
68b0: 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44  dLibraryW ((HMOD
68c0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
68d0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  WSTR))aSyscall[4
68e0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
68f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6900: 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  RT.  { "LocalFre
6910: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6920: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c    (SYSCALL)Local
6930: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
6940: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6950: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6970: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
69a0: 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65  fine osLocalFree
69b0: 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49   ((HLOCAL(WINAPI
69c0: 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63  *)(HLOCAL))aSysc
69d0: 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74  all[46].pCurrent
69e0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
69f0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
6a00: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6a10: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
6a20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6a30: 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20  ALL)LockFile,   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
6a60: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6a70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6a80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6a90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6aa0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
6ab0: 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  LockFile.#define
6ac0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
6ad0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6ae0: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6af0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6b00: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6b10: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  47].pCurrent).#e
6b20: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
6b30: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
6b40: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
6b50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b60: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  LL)LockFileEx,  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6b80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6b90: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6ba0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6bc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6bd0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6be0: 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e  ockFileEx.#defin
6bf0: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28  e osLockFileEx (
6c00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c10: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6c20: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6c30: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6c40: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6c50: 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  48].pCurrent).#e
6c60: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
6c70: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
6c80: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
6c90: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6ca0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
6cb0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
6cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6cd0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
6ce0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  le,           0 
6cf0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
6d00: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
6d10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6d20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6d30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6d40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6d50: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  sMapViewOfFile (
6d60: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6d70: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6d80: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6d90: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6da0: 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65  scall[49].pCurre
6db0: 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42  nt)..  { "MultiB
6dc0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20  yteToWideChar", 
6dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c      (SYSCALL)Mul
6de0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
6df0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
6e00: 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  ine osMultiByteT
6e10: 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28  oWideChar ((int(
6e20: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
6e30: 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c  ORD,LPCSTR,int,L
6e40: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
6e50: 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35   int))aSyscall[5
6e60: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
6e70: 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61  { "QueryPerforma
6e80: 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59  nceCounter", (SY
6e90: 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f  SCALL)QueryPerfo
6ea0: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30  rmanceCounter, 0
6eb0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51   },..#define osQ
6ec0: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6ed0: 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49  ounter ((BOOL(WI
6ee0: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
6ef0: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a    LARGE_INTEGER*
6f00: 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70  ))aSyscall[51].p
6f10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52  Current)..  { "R
6f20: 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20  eadFile",       
6f30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6f40: 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20  L)ReadFile,     
6f50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6f60: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46  .#define osReadF
6f70: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6f80: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49  I*)(HANDLE,LPVOI
6f90: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
6fa0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6fb0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6fc0: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
6fd0: 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69  .  { "SetEndOfFi
6fe0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
6ff0: 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f  (SYSCALL)SetEndO
7000: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
7010: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7020: 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28  osSetEndOfFile (
7030: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7040: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
7050: 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  53].pCurrent)..#
7060: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7070: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
7080: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
7090: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
70a0: 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20  ilePointer,     
70b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
70c0: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
70d0: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
70e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7110: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
7120: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
7130: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7140: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
7150: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
7160: 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e  call[54].pCurren
7170: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
7180: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c  OS_WINRT.  { "Sl
7190: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
71a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
71b0: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
71c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
71d0: 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22  else.  { "Sleep"
71e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7220: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65  f..#define osSle
7230: 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  ep ((VOID(WINAPI
7240: 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61  *)(DWORD))aSysca
7250: 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[55].pCurrent)
7260: 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d  ..  { "SystemTim
7270: 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20  eToFileTime",   
7280: 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d   (SYSCALL)System
7290: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20  TimeToFileTime, 
72a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
72b0: 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46   osSystemTimeToF
72c0: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
72d0: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59  INAPI*)(CONST SY
72e0: 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  STEMTIME*, \.   
72f0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
7300: 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43  )aSyscall[56].pC
7310: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
7320: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
7330: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7340: 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  T.  { "UnlockFil
7350: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
7360: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
7370: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
7380: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7390: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
73b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
73d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
73e0: 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  def osUnlockFile
73f0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
7400: 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  kFile ((BOOL(WIN
7410: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7420: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
7430: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
7440: 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43  )aSyscall[57].pC
7450: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
7460: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7470: 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INCE.  { "Unlock
7480: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
7490: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
74a0: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
74b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
74c0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
74d0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
74e0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7510: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
7520: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
7530: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7540: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
7550: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
7560: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
7570: 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [58].pCurrent)..
7580: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7590: 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NCE || !defined(
75a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
75b0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
75c0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
75d0: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
75e0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
75f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7600: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
7610: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
7620: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7640: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7650: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
7660: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7670: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
7680: 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72  yscall[59].pCurr
7690: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
76a0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
76b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
76c0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
76d0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
76e0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
76f0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
7700: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
7710: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
7720: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
7730: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
7740: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30  OOL))aSyscall[60
7750: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7760: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
7770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7780: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
77a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
77b0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
77c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
77d0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
77e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
77f0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7800: 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72  yscall[61].pCurr
7810: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7820: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43  _OS_WINRT.  { "C
7830: 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20  reateEventExW", 
7840: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7850: 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  L)CreateEventExW
7860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
7870: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
7880: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
7890: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
78c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
78d0: 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48  eateEventExW ((H
78e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
78f0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
7900: 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a  UTES,LPCWSTR, \.
7910: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
7920: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32  ORD))aSyscall[62
7930: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7940: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7950: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7960: 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20  ngleObject",    
7970: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
7980: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20  rSingleObject,  
7990: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
79a0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
79b0: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
79c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
79e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
79f0: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
7a00: 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52  gleObject ((DWOR
7a10: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7a20: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  E, \.        DWO
7a30: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d  RD))aSyscall[63]
7a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7a50: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7a60: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7a70: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
7a80: 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d  eObjectEx,   0 }
7a90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  ,..#define osWai
7aa0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7ab0: 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Ex ((DWORD(WINAP
7ac0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
7ad0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c  , \.        BOOL
7ae0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70  ))aSyscall[64].p
7af0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7b00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7b10: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
7b20: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
7b30: 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69  SCALL)SetFilePoi
7b40: 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30  nterEx,        0
7b50: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
7b60: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22  etFilePointerEx"
7b70: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
7b80: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7b90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7ba0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7bb0: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
7bc0: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7bd0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f  *)(HANDLE,LARGE_
7be0: 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20  INTEGER, \.     
7bf0: 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45     PLARGE_INTEGE
7c00: 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  R,DWORD))aSyscal
7c10: 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[65].pCurrent).
7c20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7c30: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c  INRT.  { "GetFil
7c40: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7c50: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
7c60: 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  L)GetFileInforma
7c70: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20  tionByHandleEx, 
7c80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7c90: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
7ca0: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
7cb0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7cd0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7ce0: 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d   osGetFileInform
7cf0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20  ationByHandleEx 
7d00: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7d10: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
7d20: 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48    FILE_INFO_BY_H
7d30: 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f  ANDLE_CLASS,LPVO
7d40: 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  ID,DWORD))aSysca
7d50: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
7d60: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7d70: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
7d80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7d90: 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  L).  { "MapViewO
7da0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
7db0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
7dc0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c  ewOfFileFromApp,
7dd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7de0: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
7df0: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
7e00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7e30: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
7e40: 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50  FileFromApp ((LP
7e50: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
7e60: 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  NDLE,ULONG,ULONG
7e70: 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  64, \.        SI
7e80: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36  ZE_T))aSyscall[6
7e90: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
7ea0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7eb0: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  T.  { "CreateFil
7ec0: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
7ed0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
7ee0: 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20  File2,          
7ef0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7f00: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7f20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7f50: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
7f60: 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  2 ((HANDLE(WINAP
7f70: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
7f80: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7f90: 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54  .        LPCREAT
7fa0: 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
7fb0: 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73  PARAMETERS))aSys
7fc0: 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e  call[68].pCurren
7fd0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7fe0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
7ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8000: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
8010: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
8020: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
8030: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b  SYSCALL)LoadPack
8040: 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20  agedLibrary,    
8050: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8060: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
8070: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
8080: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
80a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
80b0: 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  e osLoadPackaged
80c0: 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c  Library ((HMODUL
80d0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
80e0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
80f0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39  ORD))aSyscall[69
8100: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8110: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8120: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
8130: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
8140: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
8150: 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20  Count64,        
8160: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8170: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
8180: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8190: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
81b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
81c0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
81d0: 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28  t64 ((ULONGLONG(
81e0: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
81f0: 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72  Syscall[70].pCur
8200: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8210: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8220: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8230: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
8240: 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74  LL)GetNativeSyst
8250: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c  emInfo,     0 },
8260: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e  .#else.  { "GetN
8270: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
8280: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
82a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
82b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
82c0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
82d0: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
82e0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
82f0: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
8300: 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65  scall[71].pCurre
8310: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
8320: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
8330: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74  S_ANSI).  { "Out
8340: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
8350: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8360: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8370: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
8380: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8390: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
83a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
83d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
83e0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28  utDebugStringA (
83f0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
8400: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
8410: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
8420: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8430: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
8440: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8450: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
8460: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8470: 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20  DebugStringW,   
8480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8490: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
84a0: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
84b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
84d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
84e0: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
84f0: 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28  gStringW ((VOID(
8500: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
8510: 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70  ))aSyscall[73].p
8520: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
8530: 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20  etProcessHeap", 
8540: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
8550: 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  L)GetProcessHeap
8560: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
8570: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
8580: 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44  ocessHeap ((HAND
8590: 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  LE(WINAPI*)(VOID
85a0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70  ))aSyscall[74].p
85b0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
85c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
85d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
85e0: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22  _OMIT_WAL).  { "
85f0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8600: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
8610: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
8620: 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20  ppingFromApp, 0 
8630: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
8640: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8650: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
8660: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8670: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8680: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8690: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
86a0: 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44  ngFromApp ((HAND
86b0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
86c0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
86d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
86e0: 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  TES,ULONG,ULONG6
86f0: 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  4,LPCWSTR))aSysc
8700: 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74  all[75].pCurrent
8710: 29 0a 0a 20 20 7b 20 22 44 75 70 6c 69 63 61 74  )..  { "Duplicat
8720: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
8730: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 75 70 6c     (SYSCALL)Dupl
8740: 69 63 61 74 65 48 61 6e 64 6c 65 2c 20 20 20 20  icateHandle,    
8750: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
8760: 65 20 6f 73 44 75 70 6c 69 63 61 74 65 48 61 6e  e osDuplicateHan
8770: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
8780: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
8790: 20 20 20 20 20 20 48 41 4e 44 4c 45 2c 48 41 4e        HANDLE,HAN
87a0: 44 4c 45 2c 4c 50 48 41 4e 44 4c 45 2c 44 57 4f  DLE,LPHANDLE,DWO
87b0: 52 44 2c 42 4f 4f 4c 2c 44 57 4f 52 44 29 29 61  RD,BOOL,DWORD))a
87c0: 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72  Syscall[76].pCur
87d0: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
87e0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
87f0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
8800: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
8810: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
8820: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
8830: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
8840: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
8850: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
8860: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8870: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
8880: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
8890: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
88a0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
88b0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
88c0: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
88d0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
88e0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
88f0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
8900: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
8910: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
8920: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
8930: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
8940: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
8950: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
8960: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
8970: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8980: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
8990: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
89a0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
89b0: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
89c0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
89d0: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
89e0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
89f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
8a00: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
8a10: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
8a20: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
8a30: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
8a40: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
8a50: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
8a60: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
8a70: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
8a80: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
8a90: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
8aa0: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
8ab0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
8ac0: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
8ad0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8ae0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8af0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8b00: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
8b10: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
8b20: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
8b30: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
8b40: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
8b50: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
8b60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8b70: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
8b80: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
8b90: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
8ba0: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
8bb0: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
8bc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8bd0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8be0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8bf0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8c00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8c10: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
8c20: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
8c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
8c40: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
8c50: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
8c60: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8c70: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
8c80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8c90: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
8ca0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8cb0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
8cc0: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
8cd0: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
8ce0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
8cf0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
8d00: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
8d10: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
8d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8d40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8d50: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
8d60: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
8d70: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8d80: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8d90: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
8da0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8db0: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
8dc0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
8dd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
8de0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
8df0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
8e00: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
8e10: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
8e20: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
8e30: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
8e40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8e50: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
8e60: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
8e70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
8e80: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
8e90: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8ea0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8eb0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8ec0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
8ed0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8ee0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
8ef0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
8f00: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
8f10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8f20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8f30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
8f40: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
8f50: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
8f60: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
8f70: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
8f80: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
8f90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
8fa0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
8fb0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
8fc0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
8fd0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
8fe0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
8ff0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9000: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
9020: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
9030: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
9040: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
9050: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
9060: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9070: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9080: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9090: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
90a0: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
90b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
90c0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
90d0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
90e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
90f0: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9100: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9110: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9120: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9130: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9140: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9150: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9160: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9170: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9180: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9190: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
91a0: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
91b0: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
91c0: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
91d0: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
91e0: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
91f0: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9200: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9210: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9220: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9230: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9240: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9250: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9260: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9270: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9280: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9290: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
92a0: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
92b0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
92c0: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
92d0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
92e0: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
92f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9300: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9310: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
9320: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
9330: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9340: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9350: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9360: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9370: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9380: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9390: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
93a0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
93b0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
93c0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
93d0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
93e0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
93f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9400: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9410: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9420: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9430: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9440: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9450: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9460: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9470: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9480: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9490: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
94a0: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
94b0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
94c0: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
94d0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
94e0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
94f0: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9500: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9520: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9530: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9540: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9550: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9580: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9590: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
95a0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
95b0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
95c0: 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  R, "failed to He
95d0: 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c  apCompact (%lu),
95e0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
9600: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9610: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9620: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
9640: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
9650: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46  _log(SQLITE_NOTF
9660: 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74 6f  OUND, "failed to
9670: 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68 65   HeapCompact, he
9680: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9690: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
96a0: 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  ap);.  rc = SQLI
96b0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e  TE_NOTFOUND;.#en
96c0: 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72 67  dif.  if( pnLarg
96d0: 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73 74  est ) *pnLargest
96e0: 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72   = nLargest;.  r
96f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9700: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
9710: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
9720: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
9730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
9740: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
9750: 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72  destroy and recr
9760: 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68 65  eate it.  If the
9770: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9780: 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74  ap is not isolat
9790: 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65  ed and/or.** the
97a0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
97b0: 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  used() function 
97c0: 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e 20  does not return 
97d0: 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53  zero, SQLITE_BUS
97e0: 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74  Y will.** be ret
97f0: 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68 61  urned and no cha
9800: 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64  nges will be mad
9810: 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 6e  e to the Win32 n
9820: 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69  ative heap..*/.i
9830: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
9840: 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a 20  _reset_heap(){. 
9850: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45 58   int rc;.  MUTEX
9860: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
9870: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
9880: 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74  ) /* The main st
9890: 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20  atic mutex */.  
98a0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
98b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d  ite3_mutex *pMem
98c0: 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d 65  ; )    /* The me
98d0: 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74 65  msys static mute
98e0: 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  x */.  MUTEX_LOG
98f0: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
9900: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9910: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9920: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
9930: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
9940: 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  em = sqlite3Mute
9950: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9960: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
9970: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
9980: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
9990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
99a0: 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a  ex_enter(pMem);.
99b0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
99c0: 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69 6e  gic();.  if( win
99d0: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
99e0: 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f  LL && winMemGetO
99f0: 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74 65  wned() && sqlite
9a00: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9a10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
9a20: 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
9a30: 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  t, there should 
9a40: 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
9a50: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
9a60: 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74  ions on.    ** t
9a70: 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20  he heap.  Also, 
9a80: 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20 6d  since both the m
9a90: 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79 73  aster and memsys
9aa0: 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72 65   locks are curre
9ab0: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ntly.    ** bein
9ac0: 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f  g held by us, no
9ad0: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20   other function 
9ae0: 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68  (i.e. from anoth
9af0: 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75 6c  er thread) shoul
9b00: 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c 65  d.    ** be able
9b10: 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73 20   to even access 
9b20: 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65 6d  the heap.  Attem
9b30: 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e  pt to destroy an
9b40: 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a 20  d recreate our. 
9b50: 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57     ** isolated W
9b60: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9b70: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
9b80: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9b90: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29  etHeap()!=NULL )
9ba0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9bb0: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
9bc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9bd0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9be0: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69  d()==0 );.    wi
9bf0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e  nMemShutdown(win
9c00: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
9c10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  ;.    assert( wi
9c20: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e  nMemGetHeap()==N
9c30: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9c40: 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  t( !winMemGetOwn
9c50: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9c60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9c70: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9c80: 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49      rc = winMemI
9c90: 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  nit(winMemGetDat
9ca0: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
9cb0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
9cc0: 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48  OK || winMemGetH
9cd0: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9cf0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
9d00: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a  emGetOwned() );.
9d10: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9d20: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
9d30: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9d40: 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ()==0 );.  }else
9d50: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9d60: 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  The Win32 native
9d70: 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20   heap cannot be 
9d80: 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65  modified because
9d90: 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73   it may be in us
9da0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
9db0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9dc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
9dd0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b  tex_leave(pMem);
9de0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9df0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
9e00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9e20: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9e30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9e40: 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68  ction outputs th
9e50: 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53  e specified (ANS
9e60: 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65  I) string to the
9e70: 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a   Win32 debugger.
9e80: 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  ** (if available
9e90: 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69  )..*/..void sqli
9ea0: 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f  te3_win32_write_
9eb0: 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72  debug(const char
9ec0: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66   *zBuf, int nBuf
9ed0: 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75  ){.  char zDbgBu
9ee0: 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f[SQLITE_WIN32_D
9ef0: 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20  BG_BUF_SIZE];.  
9f00: 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e  int nMin = MIN(n
9f10: 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e  Buf, (SQLITE_WIN
9f20: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
9f30: 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65  - 1)); /* may be
9f40: 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20   negative. */.  
9f50: 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d  if( nMin<-1 ) nM
9f60: 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20  in = -1; /* all 
9f70: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
9f80: 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20  become -1. */.  
9f90: 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31  assert( nMin==-1
9fa0: 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e   || nMin==0 || n
9fb0: 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32  Min<SQLITE_WIN32
9fc0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b  _DBG_BUF_SIZE );
9fd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
9fe0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
9ff0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
a000: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a010: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
a020: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a030: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a040: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a050: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
a060: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
a070: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
a080: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
a090: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
a0a0: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
a0b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a0c0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
a0d0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a0e0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a0f0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a100: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
a110: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
a120: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
a130: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a140: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
a150: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
a160: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
a170: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
a180: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a190: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
a1a0: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
a1b0: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
a1c0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
a1d0: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
a1e0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
a1f0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
a200: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
a210: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a220: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
a230: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
a240: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
a250: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a260: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
a270: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
a280: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
a290: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
a2a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
a2b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a2c0: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
a2d0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
a2e0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
a2f0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
a300: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
a310: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
a320: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
a330: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
a340: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
a350: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
a360: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
a370: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
a380: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
a390: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
a3a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a3b0: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
a3c0: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
a3d0: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
a3e0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
a3f0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
a400: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
a410: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
a440: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a450: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
a460: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
a470: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
a480: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
a490: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
a4a0: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
a4b0: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
a4c0: 69 66 0a 7d 0a 0a 44 57 4f 52 44 20 73 71 6c 69  if.}..DWORD sqli
a4d0: 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e  te3Win32Wait(HAN
a4e0: 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20  DLE hObject){.  
a4f0: 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c  DWORD rc;.  whil
a500: 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46  e( (rc = osWaitF
a510: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
a520: 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49  (hObject, INFINI
a530: 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45 29             TRUE)
a560: 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c  )==WAIT_IO_COMPL
a570: 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75  ETION ){}.  retu
a580: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a590: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
a5a0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
a5b0: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
a5c0: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
a5d0: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
a5e0: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
a5f0: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
a600: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
a610: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
a620: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
a630: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
a640: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
a650: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
a660: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
a670: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
a680: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
a690: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
a6a0: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
a6b0: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
a6c0: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
a6d0: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
a6e0: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
a6f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
a700: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
a710: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
a720: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
a730: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
a740: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
a750: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a760: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
a770: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
a780: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a  leEx() API..*/..
a790: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a7a0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
a7b0: 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49  SIONEX) || !SQLI
a7c0: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
a7d0: 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f  IONEX.# define o
a7e0: 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c  sIsNT()  (1).#el
a7f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
a800: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
a810: 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65  WINRT || !define
a820: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a830: 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e  AS_ANSI).# defin
a840: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a  e osIsNT()  (1).
a850: 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53  #elif !defined(S
a860: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
a870: 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f  WIDE).# define o
a880: 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c  sIsNT()  (0).#el
a890: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  se.  static int 
a8a0: 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20  osIsNT(void){.  
a8b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73    if( sqlite3_os
a8c0: 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20  _type==0 ){.#if 
a8d0: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
a8e0: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
a8f0: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
a900: 5f 57 49 4e 38 0a 20 20 20 20 20 20 4f 53 56 45  _WIN8.      OSVE
a910: 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f  RSIONINFOW sInfo
a920: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
a930: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
a940: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
a950: 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65  );.      osGetVe
a960: 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29  rsionExW(&sInfo)
a970: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 4f 53  ;.#else.      OS
a980: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e  VERSIONINFOA sIn
a990: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
a9a0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
a9b0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
a9c0: 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74  fo);.      osGet
a9d0: 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66  VersionExA(&sInf
a9e0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  o);.#endif.     
a9f0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
aa00: 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66   = sInfo.dwPlatf
aa10: 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46  ormId==VER_PLATF
aa20: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32  ORM_WIN32_NT ? 2
aa30: 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
aa40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f  return sqlite3_o
aa50: 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23  s_type==2;.  }.#
aa60: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
aa70: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
aa80: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
aa90: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
aaa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
aab0: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
aac0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
aad0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
aae0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
aaf0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
ab00: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
ab10: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
ab20: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
ab30: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
ab40: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
ab50: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
ab60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
ab70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ab80: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
ab90: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
aba0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
abb0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
abc0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
abd0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
abe0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
abf0: 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73  s>=0 );.  p = os
ac00: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
ac10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
ac20: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
ac30: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28  T)nBytes);.  if(
ac40: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
ac50: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ac60: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
ac70: 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74  HeapAlloc %u byt
ac80: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  es (%lu), heap=%
ac90: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
aca0: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
acb0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
acc0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
acd0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
ace0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
acf0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
ad00: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
ad10: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
ad20: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
ad30: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
ad40: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
ad50: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
ad60: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
ad70: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
ad80: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
ad90: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
ada0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
adb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
adc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
add0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
ade0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
adf0: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
ae00: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
ae10: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
ae20: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50  #endif.  if( !pP
ae30: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f  rior ) return; /
ae40: 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74  * Passing NULL t
ae50: 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e  o HeapFree is un
ae60: 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66  defined. */.  if
ae70: 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48  ( !osHeapFree(hH
ae80: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
ae90: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
aea0: 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  rior) ){.    sql
aeb0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
aec0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
aed0: 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b  o HeapFree block
aee0: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
aef0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
af00: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
af10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
af20: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
af30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
af40: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
af50: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
af60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
af70: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
af80: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
af90: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
afa0: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
afb0: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
afc0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
afd0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
afe0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
aff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b000: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
b010: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
b020: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
b030: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b040: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
b050: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
b060: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
b070: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
b080: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
b090: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b0a0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
b0b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
b0c0: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
b0d0: 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  ;.  if( !pPrior 
b0e0: 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  ){.    p = osHea
b0f0: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
b100: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b110: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
b120: 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Bytes);.  }else{
b130: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52  .    p = osHeapR
b140: 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  eAlloc(hHeap, SQ
b150: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b160: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28  FLAGS, pPrior, (
b170: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
b180: 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a    }.  if( !p ){.
b190: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b1a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b1b0: 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62  ailed to %s %u b
b1c0: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
b1d0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
b1e0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
b1f0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
b200: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
b210: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
b220: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
b230: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
b240: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
b250: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
b260: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
b270: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
b280: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
b290: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
b2a0: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
b2b0: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
b2c0: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
b2d0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
b2e0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b2f0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b300: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b310: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b320: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b340: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b350: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b360: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b370: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b380: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b390: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b3a0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b3b0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
b3c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
b3d0: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
b3e0: 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65    n = osHeapSize
b3f0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
b400: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
b410: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
b420: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
b430: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b440: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
b450: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
b460: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
b470: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
b480: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
b490: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
b4a0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
b4b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b4c0: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
b4d0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
b4e0: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
b4f0: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
b500: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
b510: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b520: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
b530: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
b540: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
b550: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
b560: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
b570: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
b580: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
b590: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
b5a0: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
b5b0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
b5c0: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
b5d0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
b5e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
b5f0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b600: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
b610: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
b620: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b630: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
b640: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69  EM_MAGIC2 );..#i
b650: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
b660: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
b670: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20  32_HEAP_CREATE. 
b680: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
b690: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
b6a0: 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53  DWORD dwInitialS
b6b0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  ize = SQLITE_WIN
b6c0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
b6d0: 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d  E;.    DWORD dwM
b6e0: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57  aximumSize = (DW
b6f0: 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  ORD)sqlite3Globa
b700: 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20  lConfig.nHeap;. 
b710: 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d     if( dwMaximum
b720: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
b730: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d   dwMaximumSize =
b740: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b750: 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20  AP_MAX_SIZE;.   
b760: 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69   }else if( dwIni
b770: 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d  tialSize>dwMaxim
b780: 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  umSize ){.      
b790: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20  dwInitialSize = 
b7a0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20  dwMaximumSize;. 
b7b0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
b7c0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
b7d0: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
b7e0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b7f0: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74            dwInit
b820: 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d  ialSize, dwMaxim
b830: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  umSize);.    if(
b840: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
b850: 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Heap ){.      sq
b860: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b870: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
b880: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61    "failed to Hea
b890: 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66  pCreate (%lu), f
b8a0: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
b8b0: 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25  e=%lu, maxSize=%
b8c0: 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f  lu",.          o
b8d0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
b8e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b8f0: 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74  AP_FLAGS, dwInit
b900: 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ialSize,.       
b910: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
b920: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b930: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b940: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
b950: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
b960: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
b970: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
b980: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
b990: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
b9a0: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
b9b0: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
b9c0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
b9d0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
b9e0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b9f0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
ba00: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
ba10: 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c  cessHeap (%lu)",
ba20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
ba30: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
ba40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ba50: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
ba60: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
ba70: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
ba80: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
ba90: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
baa0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bab0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bac0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bad0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
bae0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
baf0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
bb00: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
bb10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
bb20: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
bb30: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
bb40: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
bb50: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
bb60: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bb70: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
bb80: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
bb90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bba0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
bbb0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bbc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
bbd0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
bbe0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
bbf0: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
bc00: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
bc10: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
bc20: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
bc30: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
bc40: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
bc50: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
bc60: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
bc70: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
bc80: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
bc90: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
bca0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
bcb0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
bcc0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
bcd0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
bce0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
bcf0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
bd00: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
bd10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
bd20: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
bd40: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
bd50: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
bd60: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bd70: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
bd80: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
bd90: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bda0: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
bdb0: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
bdc0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
bdd0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
bde0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bdf0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
be00: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
be10: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
be20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
be40: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
be50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
be60: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
be70: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
be80: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
be90: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
bea0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
beb0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
bec0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
bed0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
bee0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
bef0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
bf00: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
bf10: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
bf20: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
bf30: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
bf40: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
bf50: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
bf60: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
bf70: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
bf80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bf90: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
bfa0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
bfb0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
bfc0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
bfd0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
bfe0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
bff0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
c000: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
c010: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
c020: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
c030: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
c040: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
c050: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
c060: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
c070: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
c080: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
c090: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
c0a0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
c0b0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
c0c0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
c0d0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
c0e0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
c0f0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
c100: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
c110: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
c120: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
c130: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
c140: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
c150: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
c160: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
c170: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c180: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
c190: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c1a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
c1b0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c1c0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
c1d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
c1e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
c1f0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
c200: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
c210: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
c220: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
c230: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
c240: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
c250: 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20  nChar;.  LPWSTR 
c260: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
c270: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
c280: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
c290: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
c2a0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
c2b0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
c2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c2d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
c2e0: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
c2f0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
c300: 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65  har*sizeof(zWide
c310: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
c320: 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e    if( zWideFilen
c330: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
c340: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
c350: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
c360: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
c370: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
c380: 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
c390: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
c3c0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
c3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c3e0: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
c3f0: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
c400: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
c410: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
c420: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
c430: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
c440: 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e  nicode to UTF-8.
c450: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
c460: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
c470: 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ing is.** obtain
c480: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
c490: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
c4a0: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
c4b0: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
c4c0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
c4d0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
c4e0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
c4f0: 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  e;..  nByte = os
c500: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
c510: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
c520: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
c530: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
c540: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
c550: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c560: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
c570: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
c580: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
c590: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
c5a0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c5b0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
c5c0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
c5d0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
c5e0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
c5f0: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
c600: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
c630: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
c640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c650: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
c660: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
c670: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c680: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
c690: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
c6a0: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
c6b0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
c6c0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
c6d0: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
c6e0: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
c6f0: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
c700: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
c710: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
c720: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
c730: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
c740: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
c750: 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73  c LPWSTR winMbcs
c760: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
c770: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c780: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
c790: 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c   LPWSTR zMbcsFil
c7a0: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64  ename;.  int cod
c7b0: 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c  epage = osAreFil
c7c0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
c7d0: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
c7e0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75  ..  nByte = osMu
c7f0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c800: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
c810: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
c820: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43      0)*sizeof(WC
c850: 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  HAR);.  if( nByt
c860: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c870: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63  rn 0;.  }.  zMbc
c880: 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  sFilename = sqli
c890: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
c8a0: 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63  Byte*sizeof(zMbc
c8b0: 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  sFilename[0]) );
c8c0: 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65  .  if( zMbcsFile
c8d0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
c8e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
c8f0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
c900: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
c910: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
c920: 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69  ame, -1, zMbcsFi
c930: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a          nByte);.
c960: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
c970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c980: 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  ee(zMbcsFilename
c990: 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65  );.    zMbcsFile
c9a0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c9b0: 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65  return zMbcsFile
c9c0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
c9d0: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
c9e0: 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74   Unicode to mult
c9f0: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
ca00: 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f   string, based o
ca10: 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20  n the.** user's 
ca20: 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a  ANSI codepage..*
ca30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
ca40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
ca50: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
ca60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
ca70: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
ca80: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
ca90: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50  UnicodeToMbcs(LP
caa0: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
cab0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
cac0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
cad0: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
cae0: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
caf0: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
cb00: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
cb10: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
cb20: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
cb30: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
cb40: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
cb50: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
cb60: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
cb70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cb80: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
cb90: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
cba0: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
cbb0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
cbc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cbd0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
cbe0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
cbf0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
cc00: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
cc10: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
cc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20   nByte, 0, 0);. 
cc50: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
cc60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
cc70: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
cc80: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
cc90: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
cca0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
ccb0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74  .** Convert mult
ccc0: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
ccd0: 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e  string to UTF-8.
cce0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
ccf0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  the.** returned 
cd00: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
cd10: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
cd20: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61  malloc()..*/.cha
cd30: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
cd40: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f  _mbcs_to_utf8(co
cd50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
cd60: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ame){.  char *zF
cd70: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c  ilenameUtf8;.  L
cd80: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
cd90: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
cda0: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a  nMbcsToUnicode(z
cdb0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
cdc0: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
cdd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cde0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
cdf0: 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  8 = winUnicodeTo
ce00: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
ce10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ce20: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
ce30: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
ce40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
ce50: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
ce60: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
ce70: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
ce80: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
ce90: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
cea0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
ceb0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cec0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
ced0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
cee0: 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  _mbcs(const char
cef0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
cf00: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
cf10: 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  bcs;.  LPWSTR zT
cf20: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
cf30: 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ide = winUtf8ToU
cf40: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
cf50: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
cf60: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
cf70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
cf80: 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55  enameMbcs = winU
cf90: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
cfa0: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
cfb0: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
cfc0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
cfd0: 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  nameMbcs;.}../*.
cfe0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cff0: 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64   sets the data d
d000: 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20  irectory or the 
d010: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
d020: 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ory based on.** 
d030: 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67  the provided arg
d040: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70  uments.  The typ
d050: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
d060: 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f  be 1 in order to
d070: 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   set the.** data
d080: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20   directory or 2 
d090: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
d0a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
d0b0: 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56  rectory.  The zV
d0c0: 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  alue.** argument
d0d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d0e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
d0f0: 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72   use.  The retur
d100: 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a  n value will be.
d110: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
d120: 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69  successful..*/.i
d130: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
d140: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44  _set_directory(D
d150: 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53  WORD type, LPCWS
d160: 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68  TR zValue){.  ch
d170: 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79  ar **ppDirectory
d180: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
d190: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
d1a0: 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  IT.  int rc = sq
d1b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
d1c0: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
d1d0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
d1e0: 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  .  if( type==SQL
d1f0: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
d200: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
d210: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
d220: 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61   = &sqlite3_data
d230: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65  _directory;.  }e
d240: 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51  lse if( type==SQ
d250: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
d260: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
d270: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
d280: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d  y = &sqlite3_tem
d290: 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  p_directory;.  }
d2a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
d2b0: 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d  rectory || type=
d2c0: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
d2d0: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
d2e0: 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74  E.          || t
d2f0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
d300: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
d310: 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73  _TYPE.  );.  ass
d320: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
d330: 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64  y || sqlite3Memd
d340: 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44  ebugHasType(*ppD
d350: 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50  irectory, MEMTYP
d360: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28  E_HEAP) );.  if(
d370: 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a   ppDirectory ){.
d380: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65      char *zValue
d390: 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66  Utf8 = 0;.    if
d3a0: 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c  ( zValue && zVal
d3b0: 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  ue[0] ){.      z
d3c0: 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55  ValueUtf8 = winU
d3d0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61  nicodeToUtf8(zVa
d3e0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
d3f0: 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29   zValueUtf8==0 )
d400: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d410: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d430: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
d440: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
d450: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
d460: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
d470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d480: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
d490: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
d4a0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
d4b0: 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74   value of winGet
d4c0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20  LastErrorMsg.** 
d4d0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
d4e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
d4f0: 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
d500: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
d510: 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
d520: 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
d530: 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61  uncated)..*/.sta
d540: 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
d550: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
d560: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
d570: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
d580: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
d590: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
d5a0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
d5b0: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
d5c0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
d5d0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
d5e0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
d5f0: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
d600: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
d610: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
d620: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
d630: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
d640: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
d650: 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
d660: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
d670: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
d680: 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f  TempWide[SQLITE_
d690: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
d6a0: 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64  _CHARS+1];.    d
d6b0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
d6c0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
d6d0: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
d6e0: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
d710: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
d740: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69           zTempWi
d7b0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
d7e0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a  X_ERRMSG_CHARS,.
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
d810: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54  .#else.    LPWST
d820: 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55  R zTempWide = NU
d830: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
d840: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
d850: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
d860: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
d870: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
d890: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
d8a0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
d8d0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
d8e0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
d930: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
d980: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20    0);.#endif.   
d9d0: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
d9e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
d9f0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
da00: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
da10: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
da20: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
da30: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
da40: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
da50: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
da60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
da70: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
da80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
da90: 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72  INRT.      /* fr
daa0: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
dab0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
dac0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
dad0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
dae0: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
daf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
db00: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
db10: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
db20: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
db30: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
db40: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
db50: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
db60: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
db70: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
dba0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
dbb0: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
dbe0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
dbf0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
dc80: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
dcd0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
dce0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
dcf0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
dd00: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
dd10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
dd20: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
dd30: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
dd40: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
dd50: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
dd60: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
dd70: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
dd80: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
dd90: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
dda0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
ddb0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
ddc0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
ddd0: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
dde0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
ddf0: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
de00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
de10: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
de20: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c  f, "OsError 0x%l
de30: 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72  x (%lu)", lastEr
de40: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
de50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
de60: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
de70: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
de80: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
de90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
dea0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
deb0: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
dec0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
ded0: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
dee0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
def0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
df00: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
df10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
df20: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
df30: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
df40: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
df50: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
df60: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
df70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
df80: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
df90: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
dfa0: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
dfb0: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
dfc0: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
dfd0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
dfe0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
dff0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
e000: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
e010: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
e020: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
e030: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
e040: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
e050: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
e060: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
e070: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
e080: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
e090: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
e0a0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
e0b0: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
e0c0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
e0d0: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
e0e0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
e0f0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
e100: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
e110: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
e120: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
e130: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61  that.** failed a
e140: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
e150: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
e160: 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  th, if any..*/.#
e170: 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72  define winLogErr
e180: 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69  or(a,b,c,d)   wi
e190: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
e1a0: 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f  a,b,c,d,__LINE__
e1b0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ).static int win
e1c0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
e1d0: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
e200: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52  r code */.  DWOR
e210: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20  D lastErrno,    
e220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e230: 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20  in32 last error 
e240: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e250: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
e260: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e270: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
e280: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
e290: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2b0: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
e2c0: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
e2d0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
e300: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
e310: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
e320: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  */.){.  char zMs
e330: 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20  g[500];         
e340: 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e          /* Human
e350: 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20   readable error 
e360: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  text */.  int i;
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e390: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e3a0: 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77  zMsg[0] = 0;.  w
e3b0: 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
e3c0: 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a  g(lastErrno, siz
e3d0: 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29  eof(zMsg), zMsg)
e3e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ;.  assert( errc
e3f0: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
e400: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
e410: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
e420: 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69   for(i=0; zMsg[i
e430: 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ] && zMsg[i]!='\
e440: 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  r' && zMsg[i]!='
e450: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d  \n'; i++){}.  zM
e460: 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  sg[i] = 0;.  sql
e470: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
e480: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e  ,.      "os_win.
e490: 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25  c:%d: (%lu) %s(%
e4a0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
e4b0: 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f  iLine, lastErrno
e4c0: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
e4d0: 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zMsg.  );..  ret
e4e0: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
e4f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  /*.** The number
e500: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61   of times that a
e510: 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69   ReadFile(), Wri
e520: 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65  teFile(), and De
e530: 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69  leteFile().** wi
e540: 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f  ll be retried fo
e550: 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e  llowing a lockin
e560: 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62  g error - probab
e570: 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a  ly caused by .**
e580: 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77   antivirus softw
e590: 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69  are.  Also the i
e5a0: 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66  nitial delay bef
e5b0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65  ore the first re
e5c0: 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61  try..** The dela
e5d0: 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65  y increases line
e5e0: 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72  arly with each r
e5f0: 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  etry..*/.#ifndef
e600: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e610: 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69  ERR_RETRY.# defi
e620: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
e630: 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23  IOERR_RETRY 10.#
e640: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e650: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
e660: 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64  _RETRY_DELAY.# d
e670: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
e680: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
e690: 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73  ELAY 25.#endif.s
e6a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65  tatic int winIoe
e6b0: 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45  rrRetry = SQLITE
e6c0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
e6d0: 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  RY;.static int w
e6e0: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
e6f0: 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  y = SQLITE_WIN32
e700: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
e710: 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  AY;../*.** If a 
e720: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
e730: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
e740: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
e750: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
e760: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
e770: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
e780: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
e790: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
e7a0: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
e7b0: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
e7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e7d0: 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
e7e0: 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
e7f0: 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
e800: 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
e810: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
e820: 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
e830: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
e840: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
e850: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
e860: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e870: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d  0;.  }.  if( e==
e880: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
e890: 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  IED ||.      e==
e8a0: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
e8b0: 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d  TION ||.      e=
e8c0: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
e8d0: 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20  IOLATION ){.    
e8e0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
e8f0: 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72  eep(winIoerrRetr
e900: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
e910: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
e920: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
e930: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
e940: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
e950: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
e960: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e970: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
e980: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
e990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e9a0: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
e9b0: 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e  nRetry){.  if( n
e9c0: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
e9d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e9e0: 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64  IOERR, .      "d
e9f0: 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20  elayed %dms for 
ea00: 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e  lock/sharing con
ea10: 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69  flict",.      wi
ea20: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
ea30: 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b  *nRetry*(nRetry+
ea40: 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  1)/2.    );.  }.
ea50: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
ea60: 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
ea70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eaa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eab0: 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
eac0: 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
ead0: 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
eae0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
eaf0: 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
eb00: 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53  LTIME_API) || !S
eb10: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
eb20: 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54  TIME_API./*.** T
eb30: 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57  he MSVC CRT on W
eb40: 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f  indows CE may no
eb50: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
eb60: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
eb70: 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73  So.** create a s
eb80: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
eb90: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
eba0: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
ebb0: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
ebc0: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
ebd0: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
ebe0: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
ebf0: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
ec00: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
ec10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
ec20: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
ec30: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
ec40: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
ec50: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
ec60: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
ec70: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
ec80: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
ec90: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
eca0: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
ecb0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
ecc0: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
ecd0: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
ece0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
ecf0: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
ed00: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
ed10: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
ed20: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
ed30: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
ed40: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
ed50: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
ed60: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
ed70: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
ed80: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
ed90: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
eda0: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
edb0: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
edc0: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
edd0: 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  f..#define HANDL
ede0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
edf0: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
ee00: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
ee10: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
ee20: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
ee30: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
ee40: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
ee50: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
ee60: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
ee70: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
ee80: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
ee90: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
eea0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
eeb0: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
eec0: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
eed0: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
eee0: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
eef0: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
ef00: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
ef10: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
ef20: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ef30: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
ef40: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
ef50: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
ef60: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
ef70: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
ef80: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
ef90: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
efa0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
efb0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
efc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
efd0: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
efe0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
eff0: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
f000: 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
f010: 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
f020: 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
f030: 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
f040: 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
f050: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
f060: 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69  E;..  zName = wi
f070: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
f080: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
f090: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
f0a0: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
f0b0: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
f0c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
f0d0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  EM;.  }..  /* In
f0e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
f0f0: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
f100: 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
f110: 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
f120: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
f130: 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
f140: 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
f150: 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
f160: 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
f170: 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
f180: 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
f190: 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
f1a0: 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
f1b0: 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
f1c0: 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
f1d0: 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
f1e0: 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
f1f0: 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
f200: 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
f210: 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
f220: 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
f230: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
f240: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
f250: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
f260: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
f270: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f280: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71  tError();.    sq
f290: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
f2a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
f2b0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
f2c0: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
f2d0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
f300: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
f310: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
f320: 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
f330: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
f340: 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
f350: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
f360: 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69  tex);.  .  /* Si
f370: 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nce the names of
f380: 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20   named mutexes, 
f390: 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65  semaphores, file
f3a0: 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72   mappings etc ar
f3b0: 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  e .  ** case-sen
f3c0: 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
f3d0: 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
f3e0: 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
f3f0: 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
f400: 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
f410: 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
f420: 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
f430: 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
f440: 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
f450: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
f460: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
f470: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
f480: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
f490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
f4c0: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
f4d0: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
f510: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
f520: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
f530: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
f540: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
f550: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
f560: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
f570: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
f580: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f590: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
f5a0: 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d  if (lastErrno ==
f5b0: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
f5c0: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
f5d0: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
f5e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f5f0: 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Name);..  /* If 
f600: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
f610: 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65  making the share
f620: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c  d memory handle,
f630: 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66   map it. */.  if
f640: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
f650: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   ){.    pFile->s
f660: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
f670: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
f680: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
f690: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
f6a0: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
f6b0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
f6c0: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
f6d0: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
f6e0: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
f6f0: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
f700: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
f710: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
f720: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c  */.    if( !pFil
f730: 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20  e->shared ){.   
f740: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f750: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
f760: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
f770: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
f780: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
f790: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
f7b0: 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
f7c0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
f7d0: 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
f7e0: 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  ;.      osCloseH
f7f0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
f800: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69  ared);.      pFi
f810: 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55  le->hShared = NU
f820: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
f830: 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65   /* If shared me
f840: 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62  mory could not b
f850: 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  e created, then 
f860: 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  close the mutex 
f870: 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66  and fail */.  if
f880: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
f890: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  ==NULL ){.    if
f8a0: 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20  ( !bLogged ){.  
f8b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f8c0: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
f8d0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
f8e0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f8f0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f900: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f910: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
f920: 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e  teLock3", zFilen
f930: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67  ame);.      bLog
f940: 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ged = TRUE;.    
f950: 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  }.    winceMutex
f960: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
f970: 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
f980: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
f990: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
f9a0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
f9b0: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LL;.    return S
f9c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
f9d0: 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  .  .  /* Initial
f9e0: 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ize the shared m
f9f0: 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73  emory if we're s
fa00: 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20  upposed to */.  
fa10: 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20  if( bInit ){.   
fa20: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73   memset(pFile->s
fa30: 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  hared, 0, sizeof
fa40: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
fa50: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
fa60: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
fa70: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
fa80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fa90: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
faa0: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
fab0: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
fac0: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
fad0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
fae0: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
faf0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
fb00: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
fb10: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
fb20: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
fb30: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
fb40: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
fb50: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
fb60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
fb70: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
fb80: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
fb90: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
fba0: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
fbb0: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
fbc0: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
fbd0: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
fbe0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
fbf0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
fc00: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
fc10: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
fc20: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
fc30: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
fc40: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
fc50: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
fc60: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
fc70: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
fc80: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
fc90: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
fca0: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
fcb0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
fcc0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
fcd0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
fce0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fcf0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
fd00: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
fd10: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
fd20: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
fd30: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
fd40: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
fd50: 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
fd60: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
fd70: 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
fd80: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
fd90: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
fda0: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
fdb0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
fdc0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
fdd0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
fde0: 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c  x);    .    osCl
fdf0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
fe00: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
fe10: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
fe20: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
fe30: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
fe40: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
fe50: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
fe60: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
fe70: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
fe80: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
fe90: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
fea0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
feb0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
fec0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
fed0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
fee0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
fef0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
ff00: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
ff10: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
ff20: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
ff30: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
ff40: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
ff50: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
ff60: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
ff70: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
ff80: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
ff90: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
ffa0: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
ffb0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
ffc0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
ffd0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
ffe0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
fff0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
10000 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
10010 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
10020 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
10030 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
10040 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
10050 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
10060 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
10070 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
10080 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
10090 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
100a0 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
100b0 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
100c0 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
100d0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
100e0 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
100f0 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
10100 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10110 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
10120 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
10130 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
10140 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
10150 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
10160 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
10170 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10180 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
10190 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
101a0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
101b0 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
101c0 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
101d0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
101e0 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
101f0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10200 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
10210 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
10220 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
10230 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10240 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
10250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
10260 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10270 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
10280 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
10290 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
102a0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
102b0 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
102c0 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
102d0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
102e0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
102f0 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
10300 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
10310 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
10320 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
10330 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
10340 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
10350 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
10360 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10370 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
10380 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
10390 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
103a0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
103b0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
103c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
103d0 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
103e0 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
103f0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
10400 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
10410 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
10420 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
10430 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
10440 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
10450 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
10460 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20  served == 0) {. 
10470 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10480 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
10490 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
104a0 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
104b0 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
104c0 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
104d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
104e0 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
104f0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10500 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
10510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  ;.}../*.** An im
10520 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10530 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41  the UnlockFile A
10540 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
10550 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
10560 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  OOL winceUnlockF
10570 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
10580 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
10590 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
105a0 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
105b0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
105c0 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
105d0 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20  sToUnlockLow,.  
105e0 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
105f0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
10600 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
10610 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
10620 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
10630 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
10640 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
10650 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
10660 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10670 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10680 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10690 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b  esToUnlockHigh);
106a0 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
106b0 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
106c0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
106d0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
106e0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52  hMutex);..  /* R
106f0 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65  eleasing a reade
10700 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63  r lock or an exc
10710 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
10720 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
10730 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
10740 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20  HARED_FIRST){.  
10750 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65    /* Did we have
10760 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10770 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ck? */.    if (p
10780 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
10790 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61  lusive){.      a
107a0 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
107b0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
107c0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
107d0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46  _SIZE);.      pF
107e0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
107f0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10800 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10810 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
10820 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
10830 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10840 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20    }..    /* Did 
10850 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72  we just have a r
10860 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  eader lock? */. 
10870 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c     else if (pFil
10880 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10890 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  s){.      assert
108a0 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
108b0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
108c0 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
108d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
108e0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
108f0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
10900 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10910 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
10920 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
10930 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10940 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
10950 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
10960 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
10970 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
10980 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
109a0 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
109b0 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
109c0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
109d0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
109e0 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
109f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
10a00 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10a10 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
10a20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10a30 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
10a40 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
10a50 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
10a60 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
10a70 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
10a80 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
10a90 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10aa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
10ab0 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
10ac0 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
10ad0 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
10ae0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10af0 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
10b00 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
10b10 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10b20 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
10b30 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10b40 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
10b50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10b60 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
10b70 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
10b80 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10b90 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
10ba0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10bb0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
10bc0 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
10bd0 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
10be0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
10bf0 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  turn;.}./*.** En
10c00 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
10c10 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
10c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
10c70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10c80 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
10c90 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72  ** Lock a file r
10ca0 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  egion..*/.static
10cb0 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c   BOOL winLockFil
10cc0 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10cd0 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c  File,.  DWORD fl
10ce0 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ags,.  DWORD off
10cf0 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
10d00 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
10d10 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
10d20 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
10d30 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
10d40 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
10d50 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
10d60 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
10d70 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
10d80 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
10d90 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
10da0 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
10db0 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
10dc0 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69  turn winceLockFi
10dd0 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
10de0 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
10df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10e00 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
10e10 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
10e20 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
10e30 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
10e40 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
10e50 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ;.    memset(&ov
10e60 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
10e70 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
10e80 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
10e90 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c  fsetLow;.    ovl
10ea0 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f  p.OffsetHigh = o
10eb0 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72  ffsetHigh;.    r
10ec0 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65  eturn osLockFile
10ed0 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67  Ex(*phFile, flag
10ee0 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  s, 0, numBytesLo
10ef0 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c  w, numBytesHigh,
10f00 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   &ovlp);.  }else
10f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c  {.    return osL
10f20 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
10f30 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
10f40 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
10f50 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
10f60 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
10f70 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65  tesHigh);.  }.#e
10f80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  ndif.}../*.** Un
10f90 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  lock a file regi
10fa0 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42  on.. */.static B
10fb0 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  OOL winUnlockFil
10fc0 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
10fd0 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66  File,.  DWORD of
10fe0 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
10ff0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11000 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11010 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11020 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
11030 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11040 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
11050 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
11060 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
11070 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
11080 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
11090 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e   **       API Un
110a0 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  lockFile..  */. 
110b0 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c   return winceUnl
110c0 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
110d0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
110e0 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
11110 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
11120 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  e.  if( osIsNT()
11130 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
11140 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d  ED ovlp;.    mem
11150 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
11160 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
11170 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  );.    ovlp.Offs
11180 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a  et = offsetLow;.
11190 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48      ovlp.OffsetH
111a0 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68  igh = offsetHigh
111b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55  ;.    return osU
111c0 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46  nlockFileEx(*phF
111d0 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ile, 0, numBytes
111e0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
111f0 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
11200 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
11210 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46  sUnlockFile(*phF
11220 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
11230 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
11240 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
11270 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
11280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
112c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
112d0 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
112e0 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  f routines imple
112f0 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74  ment the I/O met
11300 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a  hods specified.*
11310 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  * by the sqlite3
11320 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
11330 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct..************
11340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  **/../*.** Some 
11390 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  Microsoft compil
113a0 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
113b0 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
113c0 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54  ndef INVALID_SET
113d0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20  _FILE_POINTER.# 
113e0 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53  define INVALID_S
113f0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
11400 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
11410 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
11420 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
11430 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ion of the file 
11440 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
11450 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
11460 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
11470 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
11480 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
11490 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
114a0 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73   0. .** Otherwis
114b0 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
114c0 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
114d0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
114e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
114f0 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  ekFile(winFile *
11500 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
11510 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23  nt64 iOffset){.#
11520 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
11530 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  NRT.  LONG upper
11540 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
11550 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
11560 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
11570 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
11580 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
115a0 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
115b0 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
115c0 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
115d0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
115e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
115f0 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
11600 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
11610 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
11620 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
11630 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
11640 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
11650 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52  ror() */..  OSTR
11660 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
11670 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c  %p, offset=%lld\
11680 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f  n", pFile->h, iO
11690 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65  ffset));..  uppe
116a0 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
116b0 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
116c0 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
116d0 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
116e0 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
116f0 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
11700 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
11710 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
11720 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
11730 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
11740 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
11750 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
11760 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
11770 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
11780 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
11790 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
117a0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
117b0 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
117c0 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
117d0 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
117e0 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
117f0 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
11800 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
11810 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11820 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
11830 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
11840 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
11850 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
11860 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
11870 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
11880 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
11890 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
118a0 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
118b0 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
118c0 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
118d0 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
118e0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
118f0 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
11900 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11910 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
11920 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
11930 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11940 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
11950 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11960 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
11970 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
119a0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
119b0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
119c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
119d0 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
119e0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
119f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11a00 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
11a10 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
11a20 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
11a30 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
11a40 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a  n 0;.#else.  /*.
11a50 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f    ** Same as abo
11a60 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
11a70 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
11a80 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69  ion works for Wi
11a90 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52  nRT..  */..  LAR
11aa0 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20  GE_INTEGER x;   
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a  The new offset *
11ad0 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20  /.  BOOL bRet;  
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
11b00 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
11b10 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a  PointerEx() */..
11b20 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69    x.QuadPart = i
11b30 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d  Offset;.  bRet =
11b40 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
11b50 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c  rEx(pFile->h, x,
11b60 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b   0, FILE_BEGIN);
11b70 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20  ..  if(!bRet){. 
11b80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11b90 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11ba0 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
11bb0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11bc0 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
11bd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
11bf0 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nSeekFile", pFil
11c00 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f  e->zPath);.    O
11c10 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
11c20 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
11c30 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20  _IOERR_SEEK\n", 
11c40 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
11c50 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
11c60 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
11c70 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11c80 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
11c90 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  >h));.  return 0
11ca0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
11cb0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
11cc0 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72  SIZE>0./* Forwar
11cd0 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
11ce0 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
11cf0 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f  ds used for memo
11d00 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20  ry mapped files 
11d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
11d20 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
11d30 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
11d40 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
11d50 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69  nUnmapfile(winFi
11d60 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  le*);.#endif../*
11d70 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
11d80 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
11d90 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
11da0 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
11db0 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
11dc0 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
11dd0 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
11de0 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
11df0 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f  esult, but Windo
11e00 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
11e10 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
11e20 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
11e30 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
11e40 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
11e50 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
11e60 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
11e70 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
11e80 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
11e90 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
11ea0 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
11eb0 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
11ec0 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
11ed0 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
11ee0 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
11ef0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
11f00 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
11f10 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
11f20 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
11f30 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74  t winClose(sqlit
11f40 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
11f50 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b  int rc, cnt = 0;
11f60 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11f70 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
11f80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
11f90 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
11fa0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
11fb0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
11fc0 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Shm==0 );.#endif
11fd0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11fe0 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ->h!=NULL && pFi
11ff0 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  le->h!=INVALID_H
12000 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20  ANDLE_VALUE );. 
12010 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12020 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69   file=%p\n", pFi
12030 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51  le->h));..#if SQ
12040 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
12050 54 48 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20  THREADS>0.  if( 
12060 70 46 69 6c 65 2d 3e 70 72 65 43 61 63 68 65 54  pFile->preCacheT
12070 68 72 65 61 64 20 29 7b 0a 20 20 20 20 76 6f 69  hread ){.    voi
12080 64 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20 20  d *pOut = 0;.   
12090 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f   sqlite3ThreadJo
120a0 69 6e 28 70 46 69 6c 65 2d 3e 70 72 65 43 61 63  in(pFile->preCac
120b0 68 65 54 68 72 65 61 64 2c 20 26 70 4f 75 74 29  heThread, &pOut)
120c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
120d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
120e0 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e  P_SIZE>0.  winUn
120f0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
12100 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20  #endif..  do{.  
12110 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61    rc = osCloseHa
12120 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  ndle(pFile->h);.
12130 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49      /* SimulateI
12140 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e  OError( rc=0; cn
12150 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  t=MX_CLOSE_ATTEM
12160 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69  PT; ); */.  }whi
12170 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63  le( rc==0 && ++c
12180 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  nt < MX_CLOSE_AT
12190 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65  TEMPT && (sqlite
121a0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
121b0 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51  0), 1) );.#if SQ
121c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64  LITE_OS_WINCE.#d
121d0 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45  efine WINCE_DELE
121e0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a  TION_ATTEMPTS 3.
121f0 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f    winceDestroyLo
12200 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ck(pFile);.  if(
12210 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
12220 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e  nClose ){.    in
12230 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77  t cnt = 0;.    w
12240 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  hile(.          
12250 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70   osDeleteFileW(p
12260 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
12270 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20  lose)==0.       
12280 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74   && osGetFileAtt
12290 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e  ributesW(pFile->
122a0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21  zDeleteOnClose)!
122b0 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20  =0xffffffff .   
122c0 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20       && cnt++ < 
122d0 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
122e0 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20  TTEMPTS.    ){. 
122f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
12300 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20  n32_sleep(100); 
12310 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c   /* Wait a littl
12320 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  e before trying 
12330 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  again */.    }. 
12340 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12350 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
12360 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  Close);.  }.#end
12370 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  if.  if( rc ){. 
12380 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55     pFile->h = NU
12390 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f  LL;.  }.  OpenCo
123a0 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54  unter(-1);.  OST
123b0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c  RACE(("CLOSE fil
123c0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
123d0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
123e0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
123f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
12400 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
12410 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
12420 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12430 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73  _CLOSE, osGetLas
12440 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20      "winClose", 
12470 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d  pFile->zPath);.}
12480 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
12490 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
124a0 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
124b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
124c0 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
124d0 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
124e0 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
124f0 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
12500 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
12510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12520 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74  winRead(.  sqlit
12530 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
12540 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
12550 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
12560 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
12570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12580 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ite content into
12590 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
125a0 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125c0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
125d0 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c  to read */.  sql
125e0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
125f0 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  t       /* Begin
12600 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73   reading at this
12610 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69   offset */.){.#i
12620 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12630 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  CE.  OVERLAPPED 
12640 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20  overlapped;     
12650 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
12660 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e  et for ReadFile.
12670 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   */.#endif.  win
12680 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
12690 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
126a0 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
126b0 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20   DWORD nRead;   
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
126e0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
126f0 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
12700 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
12730 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  trys */..  asser
12740 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
12750 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
12760 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
12770 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
12780 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
12790 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
127a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
127b0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66  EAD file=%p, buf
127c0 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25  fer=%p, amount=%
127d0 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  d, offset=%lld, 
127e0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
127f0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
12800 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
12810 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
12820 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
12830 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12840 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
12850 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
12860 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
12870 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
12880 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
12890 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
128a0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
128b0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
128c0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
128d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
128e0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
128f0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
12900 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
12910 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
12920 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
12930 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12940 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
12950 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41  TRACE(("READ-MMA
12960 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  P file=%p, rc=SQ
12970 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
12980 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
12990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
129a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
129b0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
129c0 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
129d0 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
129e0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
129f0 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
12a00 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
12a10 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
12a20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
12a30 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
12a40 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
12a50 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
12a60 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
12a70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
12a80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12a90 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b  CE.  if( winSeek
12aa0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
12ab0 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  et) ){.    OSTRA
12ac0 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
12ad0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
12ae0 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  L\n", pFile->h))
12af0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12b00 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
12b10 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
12b20 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
12b30 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
12b40 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65  0) ){.#else.  me
12b50 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
12b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
12b70 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72  LAPPED));.  over
12b80 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
12b90 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
12ba0 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f  0xffffffff);.  o
12bb0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
12bc0 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
12bd0 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
12be0 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c  fffffff);.  whil
12bf0 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
12c00 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
12c10 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65  mt, &nRead, &ove
12c20 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20  rlapped) &&.    
12c30 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
12c40 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e  ror()!=ERROR_HAN
12c50 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69  DLE_EOF ){.#endi
12c60 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  f.    DWORD last
12c70 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77  Errno;.    if( w
12c80 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
12c90 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
12ca0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12cb0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12cc0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
12cd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
12ce0 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
12cf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
12d00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12d10 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
12d20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12d30 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65  OERR_READ, pFile
12d40 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70      "winRead", p
12d70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
12d80 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  }.  winLogIoerr(
12d90 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e  nRetry);.  if( n
12da0 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20  Read<(DWORD)amt 
12db0 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  ){.    /* Unread
12dc0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
12dd0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
12de0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
12df0 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
12e00 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c  pBuf)[nRead], 0,
12e10 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20   amt-nRead);.   
12e20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
12e30 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12e40 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
12e50 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EAD\n", pFile->h
12e60 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
12e70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
12e80 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f  T_READ;.  }..  O
12e90 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
12ea0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12eb0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12ec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
12ed0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12ee0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
12ef0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
12f00 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
12f10 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12f20 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
12f30 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
12f40 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
12f50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
12f60 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
12f70 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
12f80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
12f90 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
12fa0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
12fb0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
12fc0 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
12fd0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
12fe0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
13010 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
13020 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
13030 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
13040 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
13050 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
13060 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
13070 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
13080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13090 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
130a0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
130b0 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
130c0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
130d0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
130e0 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
130f0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
13100 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
13110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13120 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
13130 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
13140 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13150 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
13160 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
13170 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
13180 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
13190 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
131a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
131b0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
131c0 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62  WRITE file=%p, b
131d0 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
131e0 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%d, offset=%lld
131f0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
13200 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
13210 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
13220 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
13230 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
13240 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
13250 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
13260 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
13270 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
13280 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
13290 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
132a0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
132b0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
132c0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
132d0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
132e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
132f0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
13300 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
13310 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
13320 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
13330 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
13340 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
13350 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
13360 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
13370 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
13380 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13390 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
133a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
133b0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
133c0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
133d0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
133e0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
133f0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
13400 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
13410 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
13420 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79  et], pBuf, nCopy
13430 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
13440 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
13450 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
13460 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
13470 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
13480 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13490 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
134a0 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69  _WINCE.  rc = wi
134b0 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
134c0 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
134d0 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20  rc==0 ){.#else. 
134e0 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53   {.#endif.#if !S
134f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13500 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
13510 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
13520 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
13530 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f  or WriteFile. */
13540 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
13550 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75  aRem = (u8 *)pBu
13560 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  f;        /* Dat
13570 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  a yet to be writ
13580 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
13590 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20  Rem = amt;      
135a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
135b0 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20  er of bytes yet 
135c0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
135d0 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74  .    DWORD nWrit
135e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
135f0 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74     /* Bytes writ
13600 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74  ten by each Writ
13610 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a  eFile() call */.
13620 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
13630 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20  rno = NO_ERROR; 
13640 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13650 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
13660 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53  ror() */..#if !S
13670 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13680 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c     memset(&overl
13690 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
136a0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
136b0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
136c0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
136d0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
136e0 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  f);.    overlapp
136f0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
13700 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
13710 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
13720 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77  );.#endif..    w
13730 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
13740 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13750 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f  NCE.      if( !o
13760 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
13770 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
13780 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a   &nWrite, 0) ){.
13790 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
137a0 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
137b0 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
137c0 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65  m, &nWrite, &ove
137d0 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64  rlapped) ){.#end
137e0 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  if.        if( w
137f0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
13800 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
13810 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
13820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13830 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
13840 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
13850 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
13860 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
13870 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
13880 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
13890 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
138a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
138b0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
138c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
138d0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
138e0 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73  WINCE.      offs
138f0 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  et += nWrite;.  
13900 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
13910 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
13920 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
13930 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ff);.      overl
13940 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
13950 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
13960 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
13970 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  fff);.#endif.   
13980 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
13990 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
139a0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
139b0 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
139c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
139d0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
139e0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
139f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
13a00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
13a10 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
13a20 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
13a30 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
13a40 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
13a50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
13a60 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
13a70 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
13a80 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
13a90 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
13aa0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
13ac0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13ad0 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61  _FULL, pFile->la
13ae0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70    "winWrite1", p
13b10 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13b20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28    }.    OSTRACE(
13b30 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
13b40 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
13b50 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65  _WRITE\n", pFile
13b60 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
13b70 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
13b80 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
13b90 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13ba0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13bb0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
13bc0 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite2", pFile->z
13bd0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
13be0 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
13bf0 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f  nRetry);.  }.  O
13c00 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
13c10 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13c20 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13c30 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
13c40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13c50 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
13c60 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
13c70 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
13c80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
13c90 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
13ca0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
13cb0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
13cc0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
13cd0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
13ce0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
13cf0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
13d00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13d20 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
13d30 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
13d40 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
13d60 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
13d70 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
13d80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
13d90 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  CATE);.  OSTRACE
13da0 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
13db0 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20  =%p, size=%lld, 
13dc0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
13dd0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
13de0 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c   nByte, pFile->l
13df0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
13e00 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
13e10 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
13e20 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
13e30 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
13e40 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
13e50 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
13e60 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
13e70 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
13e80 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
13e90 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
13ea0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
13eb0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
13ec0 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
13ed0 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
13ee0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
13ef0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
13f00 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
13f10 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
13f20 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
13f30 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
13f40 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
13f50 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  }..  /* SetEndOf
13f60 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e  File() returns n
13f70 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63  on-zero when suc
13f80 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f  cessful, or zero
13f90 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20   when it fails. 
13fa0 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b  */.  if( winSeek
13fb0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  File(pFile, nByt
13fc0 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  e) ){.    rc = w
13fd0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
13fe0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
13ff0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
14000 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14010 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
14020 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  ncate1", pFile->
14030 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20  zPath);.  }else 
14040 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f  if( 0==osSetEndO
14050 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
14060 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  &&.            (
14070 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
14080 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
14090 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45  ERROR_USER_MAPPE
140a0 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70  D_FILE) ){.    p
140b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
140c0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
140d0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
140e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
140f0 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
14100 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20  "winTruncate2", 
14130 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14140 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
14150 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
14160 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
14170 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
14180 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20   a size smaller 
14190 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
141a0 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  ly.  ** mapped r
141b0 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
141c0 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
141d0 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
141e0 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
141f0 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e  ** use read() an
14200 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63  d write() to acc
14210 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20  ess data beyond 
14220 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
14230 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  now on..  */.  i
14240 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  f( pFile->pMapRe
14250 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46  gion && nByte<pF
14260 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
14270 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
14280 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
14290 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
142a0 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66  ACE(("TRUNCATE f
142b0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
142c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
142d0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
142e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
142f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14300 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
14310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
14320 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
14330 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
14340 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
14350 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
14360 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
14370 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
14380 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
14390 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
143a0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
143b0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
143c0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
143d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
143e0 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
143f0 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
14400 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
14410 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
14420 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
14430 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
14440 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
14450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
14460 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
14470 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
14480 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
14490 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
144a0 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
144b0 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
144c0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
144d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
144e0 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
144f0 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
14500 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
14510 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
14520 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
14530 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
14540 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
14550 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
14560 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
14570 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
14580 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
14590 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
145a0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
145b0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
145c0 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
145d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
145e0 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
145f0 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
14600 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
14610 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
14620 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
14630 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
14640 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
14650 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
14660 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
14670 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
14680 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
14690 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
146a0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
146b0 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
146c0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
146d0 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
146e0 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
146f0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
14700 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
14710 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
14720 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
14730 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53  TE_FULL );..  OS
14740 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
14750 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
14760 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
14770 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
14780 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c   flags, pFile->l
14790 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e  ocktype));..#ifn
147a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
147b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
147c0 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
147d0 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
147e0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
147f0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
14800 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
14810 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
14820 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
14830 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
14840 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
14850 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
14860 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
14870 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
14880 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
14890 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
148a0 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28  SYNC.  OSTRACE((
148b0 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25  "SYNC-NOP file=%
148c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
148d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
148e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148f0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  OK;.#else.  rc =
14900 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
14910 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
14920 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14930 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
14940 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
14950 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
14960 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14970 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
14980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
14990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
149a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
149b0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
149c0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
149d0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
149e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
149f0 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c  _IOERR_FSYNC\n",
14a00 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14a10 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14a20 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14a30 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
14a40 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
14a70 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
14a80 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
14a90 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
14aa0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
14ab0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
14ac0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
14ad0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
14ae0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
14af0 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
14b00 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14b10 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14b20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14b30 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
14b40 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
14b50 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b  ert( pSize!=0 );
14b60 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14b70 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14b80 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
14b90 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
14ba0 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
14bb0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
14bc0 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51  pSize));..#if SQ
14bd0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
14be0 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44  {.    FILE_STAND
14bf0 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20  ARD_INFO info;. 
14c00 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65     if( osGetFile
14c10 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
14c20 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  dleEx(pFile->h, 
14c30 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f  FileStandardInfo
14c40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69         &info, si
14c70 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20  zeof(info)) ){. 
14c80 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e       *pSize = in
14c90 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61  fo.EndOfFile.Qua
14ca0 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  dPart;.    }else
14cb0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
14cc0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14cd0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14ce0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
14cf0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14d00 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
14d10 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
14d40 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14d50 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
14d60 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70   {.    DWORD upp
14d70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
14d80 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  D lowerBits;.   
14d90 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
14da0 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73  ;..    lowerBits
14db0 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65   = osGetFileSize
14dc0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
14dd0 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69  rBits);.    *pSi
14de0 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
14df0 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
14e00 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
14e10 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f  s;.    if(   (lo
14e20 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c  werBits == INVAL
14e30 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20  ID_FILE_SIZE).  
14e40 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
14e50 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
14e60 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
14e70 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  R) ){.      pFil
14e80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
14e90 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
14ea0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
14eb0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
14ec0 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
14ed0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14ef0 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
14f00 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14f10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  }.  }.#endif.  O
14f20 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
14f30 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c  le=%p, pSize=%p,
14f40 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63   *pSize=%lld, rc
14f50 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
14f60 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69     pFile->h, pSi
14f70 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69  ze, *pSize, sqli
14f80 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
14f90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14fa0 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
14fb0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
14fc0 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
14fd0 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
14fe0 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
14ff0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
15000 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
15010 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
15020 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
15030 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
15040 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
15050 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
15060 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
15070 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
15080 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
15090 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
150a0 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
150b0 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
150c0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
150d0 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
150e0 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
150f0 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
15100 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
15110 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
15120 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
15130 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
15140 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
15150 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
15160 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
15170 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
15180 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
15190 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
151a0 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
151b0 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
151c0 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
151d0 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
151e0 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
151f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
15200 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
15210 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
15220 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
15230 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
15240 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
15250 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
15260 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
15290 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
152a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
152b0 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
152c0 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
152d0 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
152e0 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
152f0 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
15300 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
15310 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
15320 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
15330 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
15340 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
15350 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
15360 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
15370 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
15380 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15390 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
153a0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
153b0 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
153c0 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
153d0 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
153e0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
153f0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
15400 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
15410 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
15420 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  int winGetReadLo
15430 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
15440 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
15450 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
15460 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
15470 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
15480 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
15490 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
154a0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
154b0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
154c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
154d0 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
154e0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
154f0 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
15500 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
15510 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  2.    **       A
15520 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20  PI LockFileEx.. 
15530 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20     */.    res = 
15540 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70  winceLockFile(&p
15550 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
15560 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
15570 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d  .#else.    res =
15580 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
15590 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
155a0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
155b0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
155c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
155d0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
155e0 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  IZE, 0);.#endif.
155f0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
15600 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
15610 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
15620 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
15630 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
15640 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
15650 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
15660 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
15670 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
15680 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
15690 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
156a0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
156b0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
156c0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
156f0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
15700 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
15710 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
15720 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
15730 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
15740 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15750 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
15760 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
15770 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
15780 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41  k */.  }.  OSTRA
15790 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66  CE(("READ-LOCK f
157a0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
157b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
157c0 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
157d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
157e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61  .}../*.** Undo a
157f0 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61   readlock.*/.sta
15800 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
15810 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
15820 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
15830 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61   res;.  DWORD la
15840 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41  stErrno;.  OSTRA
15850 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b  CE(("READ-UNLOCK
15860 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
15870 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
15880 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15890 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  );.  if( osIsNT(
158a0 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  ) ){.    res = w
158b0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
158c0 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
158d0 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
158e0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69  SIZE, 0);.  }.#i
158f0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
15900 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
15910 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  e{.    res = win
15920 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15930 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
15940 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
15950 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
15960 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
15970 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
15980 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
15990 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
159a0 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44  ERROR_NOT_LOCKED
159b0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
159c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
159d0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
159e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
159f0 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c  ERR_UNLOCK, pFil
15a00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15a20 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
15a30 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
15a40 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15a50 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
15a60 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
15a70 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
15a80 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
15a90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
15aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
15ab0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
15ac0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
15ad0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
15ae0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
15af0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
15b00 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
15b10 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
15b20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
15b30 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
15b40 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
15b50 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
15b60 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
15b70 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
15b80 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
15b90 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
15ba0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
15bb0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
15bc0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
15bd0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
15be0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
15bf0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
15c00 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
15c10 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
15c20 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
15c30 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
15c40 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
15c50 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
15c60 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
15c70 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
15c80 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
15c90 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
15ca0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
15cb0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
15cc0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
15cd0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
15ce0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
15cf0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
15d00 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15d10 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
15d20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
15d30 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
15d40 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
15d50 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
15d60 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
15d70 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
15d80 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
15d90 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
15da0 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
15db0 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
15dc0 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
15dd0 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
15de0 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
15df0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
15e00 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
15e10 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
15e20 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
15e30 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
15e40 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
15e50 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
15e60 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
15e70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15e80 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
15e90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15ea0 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
15eb0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
15ec0 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
15ed0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
15ee0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
15ef0 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
15f00 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
15f10 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
15f20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
15f30 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
15f40 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
15f50 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
15f60 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
15f70 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
15f80 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
15f90 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
15fa0 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
15fb0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
15fc0 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
15fd0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
15fe0 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
15ff0 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
16000 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
16010 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
16020 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
16030 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16040 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
16050 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
16060 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
16070 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
16080 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
16090 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
160a0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
160b0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
160c0 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
160d0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
160e0 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
160f0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
16100 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
16110 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
16120 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16130 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16140 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
16150 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
16160 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
16170 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
16180 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
16190 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
161a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
161b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
161c0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
161d0 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
161e0 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
161f0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
16200 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
16210 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
16220 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16230 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
16240 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
16250 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
16260 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
16270 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
16280 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
16290 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
162a0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
162b0 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
162c0 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
162d0 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
162e0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
162f0 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
16300 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
16310 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
16320 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
16330 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
16340 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
16350 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
16360 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
16370 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
16380 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
16390 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
163a0 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
163b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
163c0 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
163d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
163e0 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
163f0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
16400 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
16410 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
16420 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
16430 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
16440 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
16480 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
16490 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
164a0 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
164b0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
164c0 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  k.  This is need
164d0 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20  ed to work.     
164e0 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c   ** around probl
164f0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e  ems caused by in
16500 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e  dexing and/or an
16510 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72  ti-virus softwar
16520 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69  e on.      ** Wi
16530 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20  ndows systems.. 
16540 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61       ** If you a
16550 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f  re using this co
16560 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f  de as a model fo
16570 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46  r alternative VF
16580 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20  Ses, do not.    
16590 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72    ** copy this r
165a0 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20  etry logic.  It 
165b0 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64  is a hack intend
165c0 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f  ed for Windows o
165d0 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nly..      */.  
165e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
165f0 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
16600 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
16610 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
16620 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
16630 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
16640 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
16650 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
16660 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
16670 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
16680 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
16690 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
166a0 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
166b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
166c0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
166d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
166e0 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
166f0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
16700 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16710 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
16720 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
16730 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
16740 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
16750 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
16760 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
16770 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
16780 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
16790 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
167a0 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
167b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
167c0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
167d0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
167e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
167f0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16800 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
16810 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
16820 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
16830 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16840 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
16850 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
16860 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
16870 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
16880 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
16890 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
168a0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
168b0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
168c0 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
168d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
168e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
168f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
16900 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
16910 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
16920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
16930 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16940 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
16950 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
16960 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
16970 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
16980 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
16990 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
169a0 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
169b0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
169c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
169d0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
169e0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
169f0 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
16a00 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
16a10 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
16a20 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
16a30 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16a40 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
16a50 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
16a60 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
16a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a80 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
16a90 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
16aa0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
16ab0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
16ac0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
16ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
16ae0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16af0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
16b00 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
16b10 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
16b20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
16b30 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
16b40 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
16b50 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
16b60 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
16b70 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
16b80 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
16b90 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
16ba0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16bb0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
16bc0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16bd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
16be0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
16bf0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
16c00 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
16c10 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
16c20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16c30 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
16c40 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16c50 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
16c60 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
16c70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16c80 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
16c90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16ca0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
16cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16cc0 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  USY;.    OSTRACE
16cd0 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
16ce0 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
16cf0 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
16d00 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16d10 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
16d20 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a  Locktype));.  }.
16d30 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
16d40 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
16d50 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
16d60 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  "LOCK file=%p, l
16d70 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
16d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
16d90 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
16da0 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
16db0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
16dc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16dd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16de0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
16df0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
16e00 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
16e10 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
16e20 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
16e30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
16e40 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
16e50 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
16e60 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
16e70 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
16e80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
16e90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
16ea0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16eb0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
16ec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
16ed0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
16ee0 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
16ef0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
16f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16f10 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
16f20 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41  LOCK; );.  OSTRA
16f30 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16f40 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
16f50 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ut=%p\n", pFile-
16f60 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  >h, pResOut));..
16f70 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
16f80 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
16f90 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
16fa0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16fb0 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
16fc0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16fd0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64  K file=%p, rc=%d
16fe0 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
16ff0 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
17000 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77  else{.    rc = w
17010 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
17020 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
17030 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
17040 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17050 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
17060 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e  c ){.      winUn
17070 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17080 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
17090 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
170a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b   }.    rc = !rc;
170b0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
170c0 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
170d0 3d 25 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f  =%p, rc=%d (remo
170e0 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
170f0 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  , rc));.  }.  *p
17100 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
17110 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17120 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
17130 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
17140 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
17150 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
17160 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52      pFile->h, pR
17170 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
17180 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
171a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
171b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
171c0 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
171d0 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
171e0 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
171f0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17200 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
17210 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
17220 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
17230 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17240 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
17250 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
17260 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
17270 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
17280 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17290 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
172a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
172b0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
172c0 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
172d0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
172e0 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
172f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17300 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
17310 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
17320 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
17330 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
17340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17350 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
17360 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
17370 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
17380 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
17390 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
173a0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
173b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
173c0 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
173d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
173e0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
173f0 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
17400 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
17410 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
17420 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
17430 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
17440 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17450 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
17460 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
17470 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20  ktype));.  type 
17480 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
17490 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
174a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
174b0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
174c0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
174d0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
174e0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
174f0 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
17500 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
17510 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b   !winGetReadLock
17520 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
17530 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
17540 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
17550 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
17560 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
17570 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
17580 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
17590 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
175a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
175b0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
175c0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
175f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17610 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
17620 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
17630 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17640 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
17650 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
17660 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
17670 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
17680 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
17690 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  .    winUnlockRe
176a0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
176b0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
176c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
176d0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
176e0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
176f0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
17700 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
17710 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
17720 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
17730 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
17740 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
17750 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17760 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
17770 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
17780 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17790 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
177a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
177b0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
177c0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
177d0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
177e0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
177f0 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
17800 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
17810 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
17820 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
17830 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
17840 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
17850 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
17860 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
17870 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
17880 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
17890 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42  ic void winModeB
178a0 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  it(winFile *pFil
178b0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
178c0 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
178d0 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
178e0 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
178f0 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
17900 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
17910 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
17920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
17930 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
17940 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
17950 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
17960 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
17970 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
17980 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
17990 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73  S helper methods
179a0 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72   used for tempor
179b0 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61  ary files */.sta
179c0 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65  tic int winGetTe
179d0 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  mpname(sqlite3_v
179e0 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a  fs *, char **);.
179f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73  static int winIs
17a00 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  Dir(const void *
17a10 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  );.static BOOL w
17a20 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
17a30 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68  ndColon(const ch
17a40 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ar *);../*.** Co
17a50 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
17a60 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
17a70 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
17a80 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
17a90 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
17aa0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
17ab0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
17ac0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17ad0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
17ae0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
17af0 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20  file=%p, op=%d, 
17b00 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  pArg=%p\n", pFil
17b10 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29  e->h, op, pArg))
17b20 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
17b30 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
17b40 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
17b50 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
17b60 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
17b70 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
17b80 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
17b90 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
17ba0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
17bb0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
17bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17bd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
17be0 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
17bf0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
17c00 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
17c10 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
17c20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17c30 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17c40 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17c50 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
17c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17c70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17c80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
17c90 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
17ca0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
17cb0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
17cc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17cd0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17ce0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17cf0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
17d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17d10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
17d20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
17d30 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
17d40 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
17d50 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20  Chunk>0 ){.     
17d60 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
17d70 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20   oldSz;.        
17d80 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65  int rc = winFile
17d90 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
17da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17db0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17dc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17dd0 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a  _int64 newSz = *
17de0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
17df0 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  pArg;.          
17e00 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20  if( newSz>oldSz 
17e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
17e20 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
17e30 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
17e40 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
17e50 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29  ncate(id, newSz)
17e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ;.            Si
17e70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17e80 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ign(0);.        
17e90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17ea0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17eb0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17ec0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
17ed0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
17ee0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
17ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17f00 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
17f10 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
17f20 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
17f30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
17f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17f50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
17f60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
17f70 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
17f80 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
17f90 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
17fa0 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
17fb0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
17fc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17fd0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17fe0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17ff0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
18000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18010 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18020 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
18030 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
18040 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
18050 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
18060 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
18070 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
18080 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18090 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
180a0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
180b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
180c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
180d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
180e0 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
180f0 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
18100 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
18110 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
18120 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
18130 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
18140 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18150 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18160 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
18170 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18180 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18190 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
181a0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
181b0 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
181c0 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
181d0 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
181e0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
181f0 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
18200 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18210 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
18220 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  nIoerrRetry;.   
18230 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
18240 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
18250 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
18260 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
18270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18280 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[1] = winIoerr
18290 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
182a0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
182b0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
182c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
182d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
182e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
182f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18300 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18310 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
18320 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
18330 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  zTFile = 0;.    
18340 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65    int rc = winGe
18350 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
18360 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b  >pVfs, &zTFile);
18370 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
18380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18390 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
183a0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
183b0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
183c0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
183d0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
183e0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
183f0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
18400 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18410 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
18420 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
18430 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18440 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
18450 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
18460 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
18470 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
18480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18490 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
184a0 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
184b0 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
184c0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
184d0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
184e0 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
184f0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
18500 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
18510 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
18520 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
18530 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
18540 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
18550 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
18560 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
18570 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
18580 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
18590 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
185a0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
185b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
185c0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
185d0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
185e0 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70  c = winMapfile(p
185f0 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
18600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18610 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
18620 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
18630 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
18640 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
18650 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
18660 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
18670 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  dif.  }.  OSTRAC
18680 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18690 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54  p, rc=SQLITE_NOT
186a0 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  FOUND\n", pFile-
186b0 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
186c0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
186d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
186e0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
186f0 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
18700 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
18710 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
18720 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
18730 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
18740 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
18750 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
18760 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
18770 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
18780 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
18790 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
187a0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
187b0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
187c0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
187d0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
187e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
187f0 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
18800 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
18810 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
18820 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
18830 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
18840 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
18850 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
18860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18870 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
18880 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
18890 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74   (void)id;.  ret
188a0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
188b0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
188c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
188d0 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
188e0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
188f0 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
18900 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
18910 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
18920 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
18930 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69  winFile *p = (wi
18940 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74  nFile*)id;.  ret
18950 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
18960 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
18970 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20  N_OPEN |.       
18980 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73    ((p->ctrlFlags
18990 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29   & WINFILE_PSOW)
189a0 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f  ?SQLITE_IOCAP_PO
189b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
189c0 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E:0);.}..#if SQL
189d0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
189e0 48 52 45 41 44 53 3e 30 0a 2f 2a 0a 2a 2a 20 54  HREADS>0./*.** T
189f0 68 72 65 61 64 20 72 6f 75 74 69 6e 65 20 74 68  hread routine th
18a00 61 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  at attempts to r
18a10 65 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  ead the entire f
18a20 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ile.  This is us
18a30 65 64 20 74 6f 0a 2a 2a 20 70 72 6f 76 69 64 65  ed to.** provide
18a40 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 6f   a hint to the o
18a50 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
18a60 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
18a70 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 68  file should be h
18a80 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 61  eld.** in the ca
18a90 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
18aa0 6f 69 64 20 2a 77 69 6e 50 72 65 43 61 63 68 65  oid *winPreCache
18ab0 54 68 72 65 61 64 28 76 6f 69 64 20 2a 70 43 74  Thread(void *pCt
18ac0 78 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  x){.  winFile *p
18ad0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
18ae0 29 70 43 74 78 3b 0a 20 20 76 6f 69 64 20 2a 70  )pCtx;.  void *p
18af0 42 75 66 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44  Buf = 0;.  DWORD
18b00 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 48 41   lastErrno;.  HA
18b10 4e 44 4c 45 20 64 75 70 48 61 6e 64 6c 65 20 3d  NDLE dupHandle =
18b20 20 4e 55 4c 4c 3b 0a 20 20 44 57 4f 52 44 20 64   NULL;.  DWORD d
18b30 77 53 69 7a 65 2c 20 64 77 52 65 74 3b 0a 20 20  wSize, dwRet;.  
18b40 44 57 4f 52 44 20 64 77 41 6d 74 3b 0a 20 20 44  DWORD dwAmt;.  D
18b50 57 4f 52 44 20 6e 52 65 61 64 3b 0a 0a 20 20 69  WORD nRead;..  i
18b60 66 28 20 21 6f 73 44 75 70 6c 69 63 61 74 65 48  f( !osDuplicateH
18b70 61 6e 64 6c 65 28 47 65 74 43 75 72 72 65 6e 74  andle(GetCurrent
18b80 50 72 6f 63 65 73 73 28 29 2c 20 70 46 69 6c 65  Process(), pFile
18b90 2d 3e 68 2c 20 47 65 74 43 75 72 72 65 6e 74 50  ->h, GetCurrentP
18ba0 72 6f 63 65 73 73 28 29 2c 0a 20 20 20 20 20 20  rocess(),.      
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 20 20 26 64 75 70 48 61 6e 64 6c 65 2c 20 30     &dupHandle, 0
18bd0 2c 20 46 41 4c 53 45 2c 20 44 55 50 4c 49 43 41  , FALSE, DUPLICA
18be0 54 45 5f 53 41 4d 45 5f 41 43 43 45 53 53 29 20  TE_SAME_ACCESS) 
18bf0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
18c00 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
18c10 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
18c20 4f 53 54 52 41 43 45 28 28 22 50 52 45 2d 43 41  OSTRACE(("PRE-CA
18c30 43 48 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  CHE file=%p, rc=
18c40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5c 6e 22 2c  SQLITE_IOERR\n",
18c50 20 64 75 70 48 61 6e 64 6c 65 29 29 3b 0a 20 20   dupHandle));.  
18c60 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
18c70 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
18c80 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
18c90 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
18cb0 50 72 65 43 61 63 68 65 54 68 72 65 61 64 31 22  PreCacheThread1"
18cc0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
18cd0 0a 20 20 7d 0a 20 20 64 77 53 69 7a 65 20 3d 20  .  }.  dwSize = 
18ce0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
18cf0 28 64 75 70 48 61 6e 64 6c 65 2c 20 30 2c 20 30  (dupHandle, 0, 0
18d00 2c 20 46 49 4c 45 5f 45 4e 44 29 3b 0a 20 20 69  , FILE_END);.  i
18d10 66 28 20 28 64 77 53 69 7a 65 3d 3d 49 4e 56 41  f( (dwSize==INVA
18d20 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
18d30 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
18d40 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18d50 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
18d60 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
18d70 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
18d80 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
18d90 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
18da0 28 64 75 70 48 61 6e 64 6c 65 29 3b 0a 20 20 20  (dupHandle);.   
18db0 20 4f 53 54 52 41 43 45 28 28 22 50 52 45 2d 43   OSTRACE(("PRE-C
18dc0 41 43 48 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  ACHE file=%p, rc
18dd0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  =SQLITE_IOERR_SE
18de0 45 4b 5c 6e 22 2c 20 64 75 70 48 61 6e 64 6c 65  EK\n", dupHandle
18df0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
18e00 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
18e10 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
18e20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 20 20 20 20 20 20 22 77 69 6e 50 72 65 43 61         "winPreCa
18e50 63 68 65 54 68 72 65 61 64 32 22 2c 20 70 46 69  cheThread2", pFi
18e60 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
18e70 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
18e80 69 6c 65 50 6f 69 6e 74 65 72 28 64 75 70 48 61  ilePointer(dupHa
18e90 6e 64 6c 65 2c 20 30 2c 20 30 2c 20 46 49 4c 45  ndle, 0, 0, FILE
18ea0 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 28  _BEGIN);.  if( (
18eb0 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
18ec0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
18ed0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
18ee0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18ef0 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
18f00 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
18f10 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
18f20 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 6f 73  astErrno;.    os
18f30 43 6c 6f 73 65 48 61 6e 64 6c 65 28 64 75 70 48  CloseHandle(dupH
18f40 61 6e 64 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52  andle);.    OSTR
18f50 41 43 45 28 28 22 50 52 45 2d 43 41 43 48 45 20  ACE(("PRE-CACHE 
18f60 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
18f70 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
18f80 2c 20 64 75 70 48 61 6e 64 6c 65 29 29 3b 0a 20  , dupHandle));. 
18f90 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
18fa0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
18fb0 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
18fc0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 20 20 22 77 69 6e 50 72 65 43 61 63 68 65 54 68    "winPreCacheTh
18ff0 72 65 61 64 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  read2", pFile->z
19000 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 64 77 41  Path);.  }.  dwA
19010 6d 74 20 3d 20 34 31 39 34 33 30 34 3b 20 2f 2a  mt = 4194304; /*
19020 20 54 4f 44 4f 3a 20 54 75 6e 69 6e 67 2e 20 2a   TODO: Tuning. *
19030 2f 0a 20 20 69 66 28 20 64 77 53 69 7a 65 3c 64  /.  if( dwSize<d
19040 77 41 6d 74 20 29 7b 0a 20 20 20 20 64 77 41 6d  wAmt ){.    dwAm
19050 74 20 3d 20 64 77 53 69 7a 65 3b 0a 20 20 7d 0a  t = dwSize;.  }.
19060 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33    pBuf = sqlite3
19070 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 64 77 41 6d  MallocZero( dwAm
19080 74 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  t );.  if( pBuf=
19090 3d 30 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  =0 ){.    osClos
190a0 65 48 61 6e 64 6c 65 28 64 75 70 48 61 6e 64 6c  eHandle(dupHandl
190b0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
190c0 28 22 50 52 45 2d 43 41 43 48 45 20 66 69 6c 65  ("PRE-CACHE file
190d0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
190e0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 64  OERR_NOMEM\n", d
190f0 75 70 48 61 6e 64 6c 65 29 29 3b 0a 20 20 20 20  upHandle));.    
19100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19110 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
19120 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
19130 20 69 66 28 20 21 6f 73 52 65 61 64 46 69 6c 65   if( !osReadFile
19140 28 64 75 70 48 61 6e 64 6c 65 2c 20 70 42 75 66  (dupHandle, pBuf
19150 2c 20 64 77 41 6d 74 2c 20 26 6e 52 65 61 64 2c  , dwAmt, &nRead,
19160 20 30 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69   0) ){.      pFi
19170 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
19180 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
19190 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  ;.      osCloseH
191a0 61 6e 64 6c 65 28 64 75 70 48 61 6e 64 6c 65 29  andle(dupHandle)
191b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
191c0 28 22 50 52 45 2d 43 41 43 48 45 20 66 69 6c 65  ("PRE-CACHE file
191d0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
191e0 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20 64 75  OERR_READ\n", du
191f0 70 48 61 6e 64 6c 65 29 29 3b 0a 20 20 20 20 20  pHandle));.     
19200 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
19210 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
19220 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
19230 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 22 77 69 6e 50 72 65 43 61 63 68 65 54 68    "winPreCacheTh
19260 72 65 61 64 33 22 2c 20 70 46 69 6c 65 2d 3e 7a  read3", pFile->z
19270 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
19280 20 69 66 28 20 6e 52 65 61 64 3c 64 77 41 6d 74   if( nRead<dwAmt
19290 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73   ){.      osClos
192a0 65 48 61 6e 64 6c 65 28 64 75 70 48 61 6e 64 6c  eHandle(dupHandl
192b0 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
192c0 45 28 28 22 50 52 45 2d 43 41 43 48 45 20 66 69  E(("PRE-CACHE fi
192d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
192e0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
192f0 44 5c 6e 22 2c 20 64 75 70 48 61 6e 64 6c 65 29  D\n", dupHandle)
19300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19310 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19320 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
19330 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EAD, pFile->last
19340 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 22 77 69 6e 50 72 65 43 61 63 68 65 54 68 72 65  "winPreCacheThre
19370 61 64 34 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ad4", pFile->zPa
19380 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  th);.    }.    d
19390 77 53 69 7a 65 20 2d 3d 20 64 77 41 6d 74 3b 0a  wSize -= dwAmt;.
193a0 20 20 20 20 69 66 28 20 64 77 53 69 7a 65 3d 3d      if( dwSize==
193b0 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
193c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 73  ;.    }.  }.  os
193d0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 64 75 70 48  CloseHandle(dupH
193e0 61 6e 64 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  andle);.  return
193f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
19400 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e  ndif../* .** Win
19410 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c  dows will only l
19420 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69  et you create fi
19430 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73  le view mappings
19440 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f  .** on allocatio
19450 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69  n size granulari
19460 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a  ty boundaries..*
19470 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33  * During sqlite3
19480 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f  _os_init() we do
19490 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   a GetSystemInfo
194a0 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  ().** to get the
194b0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a   granularity siz
194c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53  e..*/.static SYS
194d0 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
194e0 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
194f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
19500 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
19510 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
19520 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
19530 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
19540 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
19550 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
19560 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
19570 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
19580 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73  used by .** this
19590 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
195a0 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
195b0 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
195c0 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
195d0 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
195e0 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
195f0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
19600 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
19610 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
19620 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
19630 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
19640 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
19650 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
19660 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
19670 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
19680 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
19690 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
196a0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
196b0 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
196c0 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
196d0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
196e0 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
196f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
19700 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
19710 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
19720 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
19730 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
19740 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
19750 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
19760 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19770 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
19780 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
19790 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
197a0 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
197b0 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  G.static int win
197c0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  ShmMutexHeld(voi
197d0 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
197e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
197f0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
19800 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
19810 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
19820 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19830 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
19840 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
19850 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
19860 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
19870 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
19880 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
19890 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
198a0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
198b0 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
198c0 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
198d0 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69  d has its own wi
198e0 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75  nFile object, bu
198f0 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f  t they all.** po
19900 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
19910 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
19920 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
19930 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a  er words, each.*
19940 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73  * log-summary is
19950 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63   opened only onc
19960 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
19970 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  *.** winShmMutex
19980 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
19990 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
199a0 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
199b0 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
199c0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
199d0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
199e0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
199f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
19a00 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a  .**      pNext .
19a10 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
19a20 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
19a30 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
19a40 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
19a50 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
19a60 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
19a70 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
19a80 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  ther winShmNode.
19a90 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
19aa0 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ld or winShmNode
19ab0 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
19ac0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19ad0 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
19ae0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
19af0 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
19b00 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
19b10 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  ucture..**.*/.st
19b20 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
19b30 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
19b40 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
19b50 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
19b60 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
19b70 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
19b80 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
19b90 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
19ba0 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68  e */.  winFile h
19bb0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
19bc0 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
19bd0 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f   from winOpen */
19be0 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  ..  int szRegion
19bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19c00 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
19c10 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
19c20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e  */.  int nRegion
19c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19c40 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
19c50 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73   apRegion */.  s
19c60 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
19c70 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61  {.    HANDLE hMa
19c80 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
19c90 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
19ca0 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  om CreateFileMap
19cb0 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64  ping */.    void
19cc0 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65   *pMap;.  } *aRe
19cd0 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61  gion;.  DWORD la
19ce0 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
19cf0 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77     /* The Window
19d00 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  s errno from the
19d10 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
19d20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20  */..  int nRef; 
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69   /* Number of wi
19d50 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
19d60 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
19d70 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73  .  winShm *pFirs
19d80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
19d90 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65   All winShm obje
19da0 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19db0 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
19dc0 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  Node *pNext;    
19dd0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
19de0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53  list of all winS
19df0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a  hmNode objects *
19e00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19e10 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53  DEBUG.  u8 nextS
19e20 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
19e30 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
19e40 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76  able winShm.id v
19e50 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
19e60 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
19e70 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77  l array of all w
19e80 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19e90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  s..**.** The win
19ea0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
19eb0 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
19ec0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
19ed0 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
19ee0 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d  */.static winShm
19ef0 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65  Node *winShmNode
19f00 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
19f10 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
19f20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
19f30 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
19f40 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
19f50 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
19f60 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
19f70 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
19f80 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
19f90 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
19fa0 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
19fb0 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
19fc0 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
19fd0 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
19fe0 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e      winShm.pShmN
19ff0 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  ode.**    winShm
1a000 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
1a010 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
1a020 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
1a030 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d  winShm.pShmNode-
1a040 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
1a050 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
1a060 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
1a070 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
1a080 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b  .struct winShm {
1a090 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1a0a0 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a  ShmNode;      /*
1a0b0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1a0c0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1a0d0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  t */.  winShm *p
1a0e0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
1a0f0 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d    /* Next winShm
1a100 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77   with the same w
1a110 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  inShmNode */.  u
1a120 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
1a130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a140 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
1a150 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65   winShmNode mute
1a160 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1a170 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1a180 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1a190 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1a1a0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1a1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a1c0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1a1d0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1a1e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a1f0 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1a220 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1a230 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20   its winShmNode 
1a240 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1a250 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
1a260 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
1a270 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1a280 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
1a290 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
1a2a0 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  4)        /* fir
1a2b0 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
1a2c0 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
1a2d0 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f  DMS    (WIN_SHM_
1a2e0 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
1a2f0 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
1a300 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
1a310 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f  .** Apply adviso
1a320 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
1a330 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69   n bytes beginni
1a340 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23  ng at ofst..*/.#
1a350 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43  define _SHM_UNLC
1a360 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  1.#define _SH
1a370 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69  M_RDLCK  2.#defi
1a380 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33  ne _SHM_WRLCK  3
1a390 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1a3a0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
1a3b0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
1a3c0 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  e,    /* Apply l
1a3d0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1a3e0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1a3f0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1a400 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1a410 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b     /* _SHM_UNLCK
1a420 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72  , _SHM_RDLCK, or
1a430 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20   _SHM_WRLCK */. 
1a440 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1a450 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1a460 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
1a470 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f  o be locked/unlo
1a480 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  cked */.  int nB
1a490 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
1a4a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a4b0 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
1a4c0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lock */.){.  int
1a4d0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1a4e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a4f0 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
1a500 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
1a510 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1a520 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
1a530 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
1a540 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a550 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1a560 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a570 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  pFile->mutex) ||
1a580 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
1a590 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
1a5a0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1a5b0 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65  , lock=%d, offse
1a5c0 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22  t=%d, size=%d\n"
1a5d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1a5e0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63  le->hFile.h, loc
1a5f0 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79  kType, ofst, nBy
1a600 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  te));..  /* Rele
1a610 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
1a620 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1a630 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
1a640 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
1a650 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
1a660 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1a670 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
1a680 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1a690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1a6a0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
1a6b0 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
1a6c0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
1a6d0 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
1a6e0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
1a6f0 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
1a700 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
1a710 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
1a720 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
1a730 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  E_LOCK;.    rc =
1a740 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
1a750 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
1a760 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20  Flags, ofst, 0, 
1a770 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  nByte, 0);.  }. 
1a780 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29   .  if( rc!= 0 )
1a790 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a7a0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1a7b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1a7c0 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
1a7d0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
1a7e0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1a7f0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1a800 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1a810 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f  , func=%s, errno
1a820 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  =%lu, rc=%s\n",.
1a830 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a840 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b  ->hFile.h, (lock
1a850 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c  Type == _SHM_UNL
1a860 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b  CK) ? "winUnlock
1a870 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20  File" :.        
1a880 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22     "winLockFile"
1a890 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1a8a0 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  no, sqlite3ErrNa
1a8b0 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74  me(rc)));..  ret
1a8c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1a8d0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1a8e0 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
1a8f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a900 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
1a910 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
1a920 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1a930 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
1a940 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
1a950 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
1a960 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
1a970 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
1a980 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
1a990 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
1a9a0 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
1a9b0 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
1a9c0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
1a9d0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1a9e0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
1a9f0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
1aa00 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
1aa10 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
1aa20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
1aa30 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
1aa40 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
1aa50 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
1aa60 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
1aa70 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
1aa80 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73  ShmNode *p;.  as
1aa90 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
1aaa0 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54  xHeld() );.  OST
1aab0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1aac0 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65   pid=%lu, delete
1aad0 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Flag=%d\n",.    
1aae0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1aaf0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ab00 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20  deleteFlag));.  
1ab10 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
1ab20 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
1ab30 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
1ab40 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
1ab50 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1ab60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
1ab70 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f  utex ){ sqlite3_
1ab80 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1ab90 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f  tex); }.      fo
1aba0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
1abb0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
1abc0 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73     BOOL bRc = os
1abd0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1abe0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
1abf0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
1ac00 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1ac10 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  -UNMAP pid=%lu, 
1ac20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
1ac30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ac40 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ac50 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
1ac60 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
1ac70 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1ac80 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
1ac90 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
1aca0 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
1acb0 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
1acc0 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
1acd0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1ace0 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53  ("SHM-PURGE-CLOS
1acf0 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1ad00 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1ad30 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1ad40 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1ad50 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1ad60 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1ad70 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1ad80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
1ad90 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
1ada0 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
1adb0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1adc0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1add0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1ade0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
1adf0 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
1ae00 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
1ae10 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
1ae20 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ae30 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
1ae40 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
1ae50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
1ae60 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ae70 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
1ae80 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
1ae90 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
1aea0 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
1aeb0 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
1aec0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1aed0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1aee0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
1aef0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1af00 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
1af10 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
1af20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
1af30 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
1af40 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
1af50 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1af60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1af70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
1af80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1af90 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
1afa0 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
1afb0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1afc0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1afd0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
1afe0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1aff0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1b000 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1b010 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1b020 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1b030 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1b040 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1b050 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1b060 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1b070 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1b080 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1b090 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1b0a0 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1b0b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1b0c0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1b0d0 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
1b0e0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
1b0f0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1b100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1b110 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1b120 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1b130 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
1b140 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
1b150 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1b160 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1b170 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1b1a0 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
1b1b0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
1b1c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1b1d0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
1b1e0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
1b1f0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
1b220 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
1b230 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1b240 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
1b250 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
1b260 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
1b270 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1b280 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
1b290 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
1b2a0 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
1b2b0 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
1b2c0 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
1b2d0 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
1b2e0 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
1b2f0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
1b300 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
1b310 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
1b320 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b330 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1b340 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1b350 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1b360 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1b370 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1b380 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1b390 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1b3a0 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1b3b0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1b3c0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1b3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b3e0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1b3f0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b400 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
1b410 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
1b420 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
1b430 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b440 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
1b450 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
1b460 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
1b470 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
1b480 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
1b490 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
1b4a0 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
1b4b0 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
1b4c0 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
1b4d0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
1b4e0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
1b4f0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
1b500 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
1b510 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
1b520 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1b530 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
1b540 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
1b550 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
1b560 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
1b570 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
1b580 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
1b590 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
1b5a0 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
1b5b0 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
1b5c0 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
1b5d0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
1b5e0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1b5f0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1b600 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
1b610 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
1b620 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
1b630 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
1b640 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
1b650 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1b660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b670 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
1b680 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
1b690 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
1b6a0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
1b6b0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1b6c0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
1b6d0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
1b6e0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1b6f0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
1b700 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
1b710 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1b720 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1b730 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1b740 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1b750 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1b760 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1b770 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b780 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1b790 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1b7a0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1b7b0 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
1b7c0 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
1b7e0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b800 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b810 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1b830 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1b840 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
1b850 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
1b860 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
1b870 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b880 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
1b890 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1b8a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1b8b0 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
1b8c0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
1b8d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1b8e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
1b8f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b900 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
1b910 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
1b920 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1b930 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
1b940 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
1b950 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1b960 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1b970 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
1b980 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
1b990 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1b9a0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1b9b0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1b9c0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1b9d0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1b9e0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1b9f0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1ba00 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
1ba10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ba20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ba30 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1ba40 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1ba50 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
1ba60 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
1ba90 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1baa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1bab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
1bad0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1bae0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1baf0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1bb00 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1bb10 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1bb20 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
1bb30 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1bb40 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1bb50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1bb60 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1bb70 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1bb80 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1bb90 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1bba0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1bbb0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1bbc0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
1bbd0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
1bbe0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
1bbf0 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
1bc00 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
1bc10 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
1bc20 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
1bc30 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1bc40 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1bc50 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1bc60 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1bc70 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1bc80 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1bc90 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
1bca0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1bcb0 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
1bcc0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
1bcd0 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
1bce0 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
1bcf0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1bd00 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1bd10 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1bd20 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1bd30 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1bd40 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1bd50 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1bd60 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1bd70 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1bd80 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1bd90 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1bda0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1bdb0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1bdc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1bdd0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1bde0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1bdf0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1be00 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1be10 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1be20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1be30 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1be40 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1be50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1be60 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1be70 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1be80 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
1be90 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1bea0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1beb0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1bec0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
1bed0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1bee0 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
1bef0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1bf00 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1bf10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1bf20 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
1bf30 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
1bf40 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1bf50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bf60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1bf70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1bf80 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1bf90 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1bfa0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
1bfb0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
1bfc0 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
1bfd0 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
1bfe0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1bff0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1c000 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1c010 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1c020 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
1c030 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
1c040 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
1c050 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
1c060 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
1c070 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1c080 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1c090 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1c0a0 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
1c0b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c0c0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1c0d0 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
1c0e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1c0f0 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
1c100 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
1c110 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
1c120 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
1c130 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1c140 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
1c150 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
1c160 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
1c170 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
1c180 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1c190 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1c1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1c1b0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1c1c0 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
1c1d0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
1c1e0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
1c1f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
1c200 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
1c210 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
1c220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c230 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1c240 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
1c250 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1c260 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
1c270 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
1c280 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
1c290 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
1c2a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
1c2b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1c2c0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
1c2d0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
1c2e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1c2f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1c300 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
1c310 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
1c320 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
1c330 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
1c340 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
1c350 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
1c360 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1c370 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1c380 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1c390 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
1c3a0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
1c3b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1c3c0 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
1c3d0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1c3e0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
1c3f0 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
1c400 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1c410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c420 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1c430 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
1c440 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1c450 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
1c460 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
1c470 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
1c480 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1c490 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1c4a0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1c4b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1c4c0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c4e0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
1c4f0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1c500 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c520 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
1c530 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
1c540 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1c550 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
1c560 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
1c570 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
1c580 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
1c590 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1c5a0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
1c5b0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1c5c0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
1c5d0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
1c5e0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1c5f0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1c600 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
1c610 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
1c620 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
1c630 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c650 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1c660 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
1c670 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1c680 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1c690 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1c6a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1c6d0 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c700 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
1c710 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
1c720 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
1c730 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
1c740 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1c750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
1c760 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1c770 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1c780 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1c790 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1c7a0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1c7b0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1c7c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1c7d0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
1c7e0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1c7f0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1c800 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1c810 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1c820 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1c830 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1c840 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
1c850 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1c860 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1c870 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
1c880 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
1c890 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
1c8a0 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
1c8b0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
1c8c0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
1c8d0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
1c8e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1c8f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c900 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1c910 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1c920 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
1c930 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
1c940 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1c950 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
1c960 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
1c970 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
1c980 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
1c990 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1c9a0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1c9b0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1c9c0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
1c9d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c9e0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
1c9f0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
1ca00 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
1ca10 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
1ca20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
1ca30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1ca40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
1ca50 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
1ca60 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
1ca70 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
1ca80 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1ca90 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1caa0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1cab0 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
1cac0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1cad0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1cae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1caf0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
1cb00 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
1cb10 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
1cb20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cb30 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
1cb40 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1cb50 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1cb60 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1cb70 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
1cb80 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1cb90 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1cba0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1cbb0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1cbc0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1cbd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1cbe0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1cbf0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1cc00 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1cc10 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1cc20 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1cc30 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1cc40 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1cc50 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1cc60 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1cc70 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1cc80 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1cc90 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1cca0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1ccb0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1ccc0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1ccd0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1cce0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1ccf0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1cd00 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1cd10 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1cd20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1cd30 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1cd40 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1cd50 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1cd60 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1cd70 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1cd80 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1cd90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cda0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1cdb0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1cdc0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1cdd0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1cde0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1cdf0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1ce00 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1ce10 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1ce20 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1ce30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ce40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ce50 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1ce60 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1ce70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ce80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1ce90 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1cea0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1ceb0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1cec0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1ced0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1cee0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1cef0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1cf00 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1cf10 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1cf20 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1cf30 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1cf40 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1cf50 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1cf60 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1cf70 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1cf80 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1cf90 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1cfa0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1cfb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cfc0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1cfd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1cfe0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1cff0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1d000 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1d010 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1d020 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1d030 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1d040 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1d050 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1d060 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1d070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d090 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1d0a0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1d0b0 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1d0c0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1d0d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1d0e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d0f0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1d100 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1d110 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1d120 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1d130 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1d140 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1d150 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1d160 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d170 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1d180 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1d190 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1d1a0 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1d1b0 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1d1c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d1d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d1e0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1d1f0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1d200 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1d210 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1d220 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1d230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1d240 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1d250 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1d260 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1d270 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1d280 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1d290 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1d2a0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1d2b0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1d2c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1d2d0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1d2e0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1d2f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1d300 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
1d310 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1d320 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
1d330 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1d340 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1d350 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
1d360 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1d370 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
1d380 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
1d390 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
1d3a0 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
1d3b0 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1d3c0 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
1d3d0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
1d3e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d3f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1d400 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
1d410 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
1d420 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
1d430 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1d440 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1d450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d460 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1d470 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
1d480 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
1d490 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
1d4a0 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
1d4b0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
1d4c0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
1d4d0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1d4e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d4f0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1d500 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d510 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1d520 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1d530 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
1d540 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
1d550 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1d560 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1d570 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1d580 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1d590 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1d5a0 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1d5b0 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1d5c0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1d5d0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1d5e0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1d5f0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1d600 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
1d610 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1d620 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1d630 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1d640 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1d650 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
1d660 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
1d670 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
1d680 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1d690 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1d6a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1d6b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
1d6c0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
1d6d0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
1d6e0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
1d6f0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
1d700 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
1d710 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1d720 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
1d730 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
1d740 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
1d750 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1d760 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
1d770 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
1d780 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1d790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1d7a0 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
1d7b0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1d7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1d7d0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
1d7e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1d7f0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
1d820 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
1d830 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
1d840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d850 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
1d860 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d880 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
1d890 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
1d8a0 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
1d8b0 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d8d0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
1d8e0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
1d8f0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1d900 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
1d910 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1d920 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1d930 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1d940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d950 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
1d960 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
1d970 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
1d980 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1d990 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1d9a0 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
1d9b0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
1d9c0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1d9d0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
1d9e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d9f0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1da00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
1da10 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
1da20 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
1da30 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
1da40 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
1da50 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1da60 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
1da70 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1da80 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1da90 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
1daa0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
1dab0 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
1dac0 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
1dad0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
1dae0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1daf0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1db00 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
1db10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1db20 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
1db30 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
1db40 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1db50 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1db60 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
1db70 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
1db80 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
1db90 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1dba0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1dbb0 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
1dbc0 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
1dbd0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
1dbe0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
1dbf0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
1dc00 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1dc10 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1dc20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1dc30 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
1dc40 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1dc50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1dc60 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1dc70 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
1dc80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dc90 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1dca0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1dcb0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1dcc0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1dcf0 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
1dd00 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
1dd10 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1dd20 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
1dd30 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1dd40 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1dd50 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1dd60 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
1dd70 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
1dd80 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
1dd90 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
1dda0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
1ddb0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1ddc0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
1ddd0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
1dde0 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
1ddf0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1de00 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
1de10 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
1de20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1de30 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1de40 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
1de50 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
1de60 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
1de70 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
1de80 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1de90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1dea0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
1deb0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1dec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ded0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1dee0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1def0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1df00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1df10 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1df20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1df30 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
1df40 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1df50 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1df60 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1df70 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
1df80 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1df90 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
1dfa0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1dfb0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
1dfc0 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
1dfd0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
1dfe0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1dff0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1e000 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
1e010 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
1e020 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
1e030 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
1e040 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e050 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1e060 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1e070 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1e080 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1e090 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1e0a0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1e0b0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1e0c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1e0d0 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1e0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1e0f0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1e100 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1e110 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1e120 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1e130 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1e140 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45       .#if SQLITE
1e150 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1e160 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1e170 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
1e180 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
1e190 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
1e1a0 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1e1b0 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ITE, nByte, NULL
1e1c0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1e1d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1e1e0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1e1f0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1e200 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1e210 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1e220 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
1e230 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1e240 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
1e250 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
1e260 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1e270 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1e280 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
1e290 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1e2a0 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
1e2b0 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
1e2c0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1e2d0 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1e2e0 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1e2f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1e300 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
1e310 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
1e320 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
1e330 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1e340 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1e350 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e360 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1e370 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
1e390 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1e3a0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
1e3b0 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
1e3c0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1e3d0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e3e0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e3f0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1e400 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1e410 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1e420 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1e430 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
1e440 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
1e450 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1e460 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
1e470 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1e480 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1e490 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1e4a0 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1e4b0 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1e4c0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1e4d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
1e4e0 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
1e4f0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1e500 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1e510 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1e520 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1e530 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
1e540 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1e550 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1e560 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1e570 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1e580 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1e590 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
1e5a0 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
1e5b0 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1e5c0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e5d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e5e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e5f0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1e600 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e620 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
1e630 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1e640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e650 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
1e660 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e670 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e680 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e690 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1e6a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e6b0 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
1e6c0 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
1e6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e6e0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1e6f0 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1e700 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1e710 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1e720 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1e730 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1e740 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1e750 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1e760 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1e770 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1e780 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1e790 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1e7a0 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1e7b0 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1e7c0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e7d0 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1e7e0 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1e7f0 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1e800 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1e810 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1e820 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1e830 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e840 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1e850 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1e860 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1e870 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1e880 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1e890 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1e8a0 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1e8b0 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1e8c0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1e8d0 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1e8e0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1e8f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e900 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1e910 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1e920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1e930 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1e940 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1e950 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1e960 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1e970 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1e980 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1e990 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1e9a0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1e9b0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1e9c0 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1e9d0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1e9e0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1e9f0 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1ea00 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1ea10 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1ea20 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1ea30 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1ea40 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1ea50 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1ea60 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1ea70 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1ea80 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1ea90 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1eaa0 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1eab0 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1eac0 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1ead0 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1eae0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1eaf0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1eb00 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1eb10 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1eb20 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1eb30 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1eb40 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1eb50 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1eb60 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1eb70 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1eb80 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1eb90 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1eba0 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1ebb0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ebc0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1ebd0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1ebe0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1ebf0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ec00 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1ec10 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1ec20 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1ec40 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ec50 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1ec60 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ec70 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1ec80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1ec90 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1eca0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1ecb0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ecc0 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1ecd0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1ed00 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
1ed10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1ed20 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1ed30 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1ed40 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1ed50 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1ed60 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
1ed70 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
1ed80 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
1ed90 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
1eda0 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
1edb0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1edc0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1edd0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1ede0 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1edf0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1ee00 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1ee10 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1ee20 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1ee40 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ee50 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1ee60 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
1ee70 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1ee80 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ee90 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1eea0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
1eed0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1eee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1eef0 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1ef00 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1ef10 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1ef20 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1ef30 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1ef40 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1ef50 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ef60 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
1ef70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ef80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1ef90 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
1efa0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
1efb0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1efc0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
1efd0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
1efe0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
1eff0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
1f000 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
1f010 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
1f020 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
1f030 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
1f040 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
1f050 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
1f060 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
1f070 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
1f080 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
1f090 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1f0a0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
1f0b0 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
1f0c0 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
1f0d0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
1f0e0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
1f0f0 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
1f100 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
1f110 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
1f120 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
1f130 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
1f140 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1f150 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
1f160 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1f170 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
1f180 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
1f190 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
1f1a0 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
1f1b0 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
1f1c0 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
1f1d0 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
1f1e0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1f1f0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
1f200 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
1f210 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f220 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
1f230 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
1f240 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
1f250 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
1f260 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
1f270 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1f280 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
1f290 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
1f2a0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1f2b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
1f2c0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1f2d0 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
1f2e0 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
1f2f0 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
1f300 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
1f310 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
1f320 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
1f330 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
1f340 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1f350 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1f360 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
1f370 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1f380 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f390 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
1f3a0 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
1f3b0 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
1f3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f3d0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
1f3e0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
1f3f0 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1f400 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
1f410 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1f420 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1f430 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1f440 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1f450 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f460 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
1f470 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f480 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f490 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
1f4a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1f4b0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
1f4c0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
1f4d0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
1f4e0 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
1f4f0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
1f500 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
1f510 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
1f520 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1f530 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20  e - 1);. .  if( 
1f540 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e  nMap==0 && pFd->
1f550 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1f560 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1f570 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Fd);.  }.  if( n
1f580 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
1f590 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ze ){.    void *
1f5a0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57  pNew = 0;.    DW
1f5b0 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41  ORD protect = PA
1f5c0 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  GE_READONLY;.   
1f5d0 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46   DWORD flags = F
1f5e0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20  ILE_MAP_READ;.. 
1f5f0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1f600 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70  pFd);.    if( (p
1f610 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
1f620 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  WINFILE_RDONLY)=
1f630 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74  =0 ){.      prot
1f640 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57  ect = PAGE_READW
1f650 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67  RITE;.      flag
1f660 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52  s |= FILE_MAP_WR
1f670 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  ITE;.    }.#if S
1f680 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1f690 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1f6a0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1f6b0 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
1f6c0 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1f6d0 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
1f6e0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1f6f0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1f700 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
1f710 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1f720 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
1f730 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f760 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1f770 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1f7b0 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1f7c0 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
1f7d0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1f7e0 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64  AS_ANSI).    pFd
1f7f0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1f800 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46  eFileMappingA(pF
1f810 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1f820 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
1f850 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
1f860 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
1f890 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
1f8a0 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  ), NULL);.#endif
1f8b0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d  .    if( pFd->hM
1f8c0 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
1f8d0 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1f8e0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1f8f0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1f900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1f910 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1f920 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1f950 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e1", pFd->zPath)
1f960 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1f970 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1f980 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1f990 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1f9a0 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1f9b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1f9c0 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
1f9d0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1f9e0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1f9f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1fa00 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1fa10 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
1fa20 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1fa30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fa40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1fa50 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20  assert( (nMap % 
1fa60 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1fa70 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20  eSize)==0 );.   
1fa80 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1fa90 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28  SIZE_T)==sizeof(
1faa0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c  sqlite3_int64) |
1fab0 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66  | nMap<=0xffffff
1fac0 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ff );.#if SQLITE
1fad0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
1fae0 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1faf0 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
1fb00 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1fb10 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
1fb20 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
1fb30 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1fb40 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
1fb50 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54  s, 0, 0, (SIZE_T
1fb60 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20  )nMap);.#endif. 
1fb70 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c     if( pNew==NUL
1fb80 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  L ){.      osClo
1fb90 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d  seHandle(pFd->hM
1fba0 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ap);.      pFd->
1fbb0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hMap = NULL;.   
1fbc0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1fbd0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1fbe0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1fbf0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1fc00 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1fc10 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1fc40 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le2", pFd->zPath
1fc50 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1fc60 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1fc70 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1fc80 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1fc90 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1fca0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1fcb0 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d  AP-FILE-MAP pid=
1fcc0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1fcd0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1fce0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1fcf0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1fd00 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1fd10 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1fd20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1fd40 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
1fd50 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  pNew;.    pFd->m
1fd60 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
1fd70 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1fd80 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a  eActual = nMap;.
1fd90 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1fda0 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1fdb0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1fdc0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1fdd0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1fde0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1fdf0 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72  , pFd));.  retur
1fe00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1fe10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1fe20 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
1fe30 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
1fe40 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
1fe50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
1fe60 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
1fe70 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
1fe80 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
1fe90 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
1fea0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
1feb0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
1fec0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
1fed0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
1fee0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
1fef0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
1ff00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1ff10 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
1ff20 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
1ff30 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
1ff40 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
1ff50 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
1ff60 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
1ff70 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
1ff80 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1ff90 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
1ffa0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
1ffb0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
1ffc0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1ffd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
1ffe0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
1fff0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
20000 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
20010 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
20020 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
20030 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
20040 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
20050 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
20060 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
20070 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
20080 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
20090 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
200a0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
200b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
200c0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
200d0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
200e0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
200f0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
20100 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
20110 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
20120 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
20130 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
20140 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
20150 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
20160 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20170 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
20180 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
20190 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
201a0 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
201b0 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
201c0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
201d0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
201e0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
201f0 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
20200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20220 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
20230 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
20240 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
20250 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20260 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20270 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
20280 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
20290 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
202a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
202b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
202c0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
202d0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
202e0 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
202f0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
20300 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
20310 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
20320 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
20330 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
20340 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
20350 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
20360 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
20370 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
20380 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20390 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
203a0 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
203b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
203c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
203d0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
203e0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
203f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20400 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
20410 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
20420 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
20430 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68  call to winFetch
20440 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
20450 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
20460 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
20470 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
20480 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
20490 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
204a0 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
204b0 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46  ssed to the winF
204c0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
204d0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
204e0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
204f0 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
20500 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20510 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
20520 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
20530 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
20540 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
20550 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
20560 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
20570 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
20580 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
20590 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
205a0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74  tic int winUnfet
205b0 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
205c0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76  *fd, i64 iOff, v
205d0 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  oid *p){.#if SQL
205e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
205f0 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
20600 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
20610 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
20620 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
20630 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  file */..  /* If
20640 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
20650 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
20660 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
20670 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
20680 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
20690 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
206a0 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
206b0 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
206c0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
206d0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
206e0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
206f0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
20700 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
20710 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
20720 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
20730 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
20740 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
20750 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
20760 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
20770 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
20780 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
20790 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
207a0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
207b0 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
207c0 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
207d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
207e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
207f0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
20800 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
20810 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
20820 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
20830 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
20840 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
20850 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
20860 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
20870 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
20880 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
20890 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
208a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
208b0 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
208c0 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
208d0 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20  cessary can can 
208e0 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74  be omitted - pot
208f0 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69  entially improvi
20900 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72  ng.    ** perfor
20910 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77  mance.  */.    w
20920 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
20930 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
20940 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
20950 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
20960 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
20970 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20980 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
20990 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
209a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
209b0 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a  cessId(), fd));.
209c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
209d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
209e0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
209f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
20a00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
20a10 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
20a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a30 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
20a40 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
20a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
20a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ab0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
20ac0 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
20ad0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
20ae0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
20af0 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
20b00 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
20b10 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
20b20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
20b30 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
20b40 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20  ethod = {.  3,  
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
20b70 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
20b80 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ba0 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
20bb0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20bd0 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
20be0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
20c00 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
20c10 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
20c20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
20c30 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
20c40 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
20c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20c60 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
20c70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
20c80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
20c90 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
20ca0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
20cc0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
20cd0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20cf0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
20d00 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
20d10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
20d20 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
20d30 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
20d40 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
20d50 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
20d60 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
20d70 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
20d80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
20d90 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
20da0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20db0 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
20dc0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
20dd0 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
20de0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
20df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20e00 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
20e10 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
20e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20e30 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
20e40 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e60 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
20e70 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20   winShmUnmap,   
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
20ea0 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20  .  winFetch,    
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
20ed0 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20    winUnfetch    
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
20f00 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
20f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f50 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
20f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
20f70 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
20f80 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
20f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
20fb0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
20fc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20fd0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
20fe0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
20ff0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69  s object..*/..#i
21000 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
21010 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  IN__)./*.** Conv
21020 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66  ert a filename f
21030 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65  rom whatever the
21040 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
21050 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20  ating system.** 
21060 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c  supports for fil
21070 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d  enames into UTF-
21080 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
21090 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  d the result is.
210a0 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
210b0 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
210c0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
210d0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
210e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
210f0 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55  r *winConvertToU
21100 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
21110 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
21120 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e  e){.  char *zCon
21130 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
21140 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
21150 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
21160 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
21170 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
21180 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
21190 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
211a0 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  lse{.    zConver
211b0 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  ted = sqlite3_wi
211c0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
211d0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
211e0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
211f0 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
21200 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
21210 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
21220 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rted;.}.#endif..
21230 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
21240 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
21250 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
21260 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
21270 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
21280 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
21290 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
212a0 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
212b0 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
212c0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
212d0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
212e0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
212f0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
21300 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43  tatic void *winC
21310 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
21320 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
21330 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
21340 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
21350 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
21360 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
21370 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
21380 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
21390 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
213a0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
213b0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
213c0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
213d0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
213e0 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
213f0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
21400 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
21410 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
21420 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
21430 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
21440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
21450 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
21460 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
21470 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20  specified UTF-8 
21480 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a  string buffer.**
21490 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72   ends with a dir
214a0 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
214b0 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e   character or on
214c0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
214d0 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69  ly.** added to i
214e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
214f0 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72   winMakeEndInDir
21500 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  Sep(int nBuf, ch
21510 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28  ar *zBuf){.  if(
21520 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74   zBuf ){.    int
21530 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53   nLen = sqlite3S
21540 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
21550 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b     if( nLen>0 ){
21560 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
21570 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e  DirSep(zBuf[nLen
21580 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
21590 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
215a0 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31  }else if( nLen+1
215b0 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  <nBuf ){.       
215c0 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69   zBuf[nLen] = wi
215d0 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20  nGetDirSep();.  
215e0 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b        zBuf[nLen+
215f0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  1] = '\0';.     
21600 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
21620 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21630 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
21640 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
21650 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
21660 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72  esulting pointer
21670 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20   into pzBuf..** 
21680 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
21690 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75  rned in pzBuf mu
216a0 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20  st be freed via 
216b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
216c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
216d0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c  nGetTempname(sql
216e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
216f0 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20  char **pzBuf){. 
21700 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
21710 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
21720 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
21730 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
21740 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
21750 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
21760 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69  123456789";.  si
21770 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74  ze_t i, j;.  int
21780 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53   nPre = sqlite3S
21790 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
217a0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
217b0 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42  ;.  int nMax, nB
217c0 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a  uf, nDir, nLen;.
217d0 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
217e0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
217f0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
21800 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
21810 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
21820 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
21830 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
21840 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
21850 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
21860 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
21870 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
21880 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
21890 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
218a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
218b0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
218c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
218d0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
218e0 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
218f0 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20   file.  ** name 
21900 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
21910 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73  y file.  If this
21920 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f   fails, we canno
21930 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f  t continue..  */
21940 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e  .  nMax = pVfs->
21950 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66  mxPathname; nBuf
21960 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a   = nMax + 2;.  z
21970 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Buf = sqlite3Mal
21980 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b  locZero( nBuf );
21990 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a  .  if( !zBuf ){.
219a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
219b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
219c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
219d0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  M\n"));.    retu
219e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
219f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
21a00 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
21a10 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72  effective tempor
21a20 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
21a30 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20  First, check if 
21a40 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  one.  ** has bee
21a50 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  n explicitly set
21a60 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
21a70 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ion; otherwise, 
21a80 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a  use the one.  **
21a90 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
21aa0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
21ab0 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72  tem..  */.  nDir
21ac0 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20   = nMax - (nPre 
21ad0 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28  + 15);.  assert(
21ae0 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28   nDir>0 );.  if(
21af0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
21b00 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69  rectory ){.    i
21b10 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c  nt nDirLen = sql
21b20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
21b30 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21b40 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  ory);.    if( nD
21b50 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  irLen>0 ){.     
21b60 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65   if( !winIsDirSe
21b70 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  p(sqlite3_temp_d
21b80 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e  irectory[nDirLen
21b90 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
21ba0 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20  nDirLen++;.     
21bb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69   }.      if( nDi
21bc0 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20  rLen>nDir ){.   
21bd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21be0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
21bf0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21c00 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21c10 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
21c20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
21c30 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21c40 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
21c50 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29  etTempname1", 0)
21c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21c70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21c80 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
21c90 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
21ca0 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
21cb0 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
21cc0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
21cd0 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
21ce0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
21cf0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  irs[] = {.      
21d00 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53   0, /* getenv("S
21d10 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a  QLITE_TMPDIR") *
21d20 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
21d30 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20  etenv("TMPDIR") 
21d40 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
21d50 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f  getenv("TMP") */
21d60 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21d70 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a  tenv("TEMP") */.
21d80 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21d90 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
21da0 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76  ") */.       "/v
21db0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  ar/tmp",.       
21dc0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
21dd0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
21de0 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20    ".",.       0 
21df0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
21e00 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20  erminator */.   
21e10 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   };.    unsigned
21e20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
21e30 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
21e40 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  ;..    if( !azDi
21e50 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
21e60 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
21e70 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  TE_TMPDIR");.   
21e80 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
21e90 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
21ea0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
21eb0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21ec0 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
21ed0 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a   getenv("TMP");.
21ee0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21ef0 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d  3] ) azDirs[3] =
21f00 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b   getenv("TEMP");
21f10 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
21f20 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20  [4] ) azDirs[4] 
21f30 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
21f40 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72  OFILE");.    for
21f50 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
21f60 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
21f70 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
21f80 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
21f90 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
21fa0 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ted;.      if( z
21fb0 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
21fc0 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e;.      /* If t
21fd0 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77  he path starts w
21fe0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
21ff0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  er followed by t
22000 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a  he colon.      *
22010 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73  * character, ass
22020 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64  ume it is alread
22030 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  y a native Win32
22040 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65   path; otherwise
22050 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75  ,.      ** it mu
22060 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  st be converted 
22070 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  to a native Win3
22080 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43  2 path via the C
22090 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20  ygwin API.      
220a0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e  ** prior to usin
220b0 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  g it..      */. 
220c0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72       if( winIsDr
220d0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
220e0 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  n(zDir) ){.     
220f0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
22100 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
22110 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29  f8Filename(zDir)
22120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
22130 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
22140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22150 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22160 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22170 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22180 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22190 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
221a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
221b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
221c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
221d0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
221e0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
221f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
22200 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
22210 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a  f, "%s", zDir);.
22220 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22230 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22240 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
22250 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
22260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22270 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22280 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22290 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
222a0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
222b0 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a  Zero( nMax+1 );.
222c0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
222d0 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
222e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
222f0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
22300 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22310 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22320 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22330 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
22340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22350 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
22360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22370 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
22380 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
22390 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43      osIsNT() ? C
223a0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
223b0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
223c0 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20  _WIN_A, zDir,.  
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
223e0 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31  onverted, nMax+1
223f0 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
22400 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22410 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22420 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22430 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
22440 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22450 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22460 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
22470 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
22480 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22490 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
224a0 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  ERR_CONVPATH, (D
224b0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
224e0 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72  Tempname2", zDir
224f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22500 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
22510 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
22520 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  .          /* At
22530 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
22540 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61  know the candida
22550 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69  te directory exi
22560 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20  sts and should. 
22570 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75           ** be u
22580 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  sed.  However, w
22590 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f  e may need to co
225a0 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67  nvert the string
225b0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
225c0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d        ** its nam
225d0 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e  e into UTF-8 (i.
225e0 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d  e. if it is UTF-
225f0 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20  16 right now).. 
22600 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
22610 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
22620 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
22630 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f  Utf8Filename(zCo
22640 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22650 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
22660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22670 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
22680 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
22690 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
226a0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
226b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
226c0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
226d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
226e0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
226f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22700 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22730 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
22740 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
22750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22760 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
22770 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22780 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
227a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
227b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
227c0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
227d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
227e0 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f  }.#elif !SQLITE_
227f0 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
22800 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
22810 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73  .  else if( osIs
22820 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
22830 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50   *zMulti;.    LP
22840 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d  WSTR zWidePath =
22850 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
22860 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28  ro( nMax*sizeof(
22870 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66  WCHAR) );.    if
22880 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a  ( !zWidePath ){.
22890 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
228a0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
228b0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
228c0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
228d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
228e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
228f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
22900 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
22910 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
22920 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74  W(nMax, zWidePat
22930 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
22940 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
22950 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
22960 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22970 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22980 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22990 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
229a0 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
229b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
229c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
229d0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
229e0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
229f0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
22a20 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
22a30 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69   zMulti = winUni
22a40 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
22a50 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
22a60 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
22a70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22a80 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
22a90 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
22aa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
22ab0 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
22ac0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
22ad0 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
22ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22af0 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
22b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22b10 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22b20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22b30 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22b40 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22b50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22b60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
22b70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
22b80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
22b90 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
22ba0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
22bb0 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
22bc0 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
22bd0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
22be0 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
22bf0 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
22c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22c10 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
22c20 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22c30 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22c40 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
22c50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22c60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
22c80 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
22c90 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
22ca0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
22cb0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22cc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22cd0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22ce0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
22cf0 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
22d00 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
22d10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
22d20 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
22d30 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
22d40 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
22d60 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
22d70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
22d80 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
22d90 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
22da0 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
22db0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
22dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
22dd0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
22de0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
22df0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22e00 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
22e10 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
22e20 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22e30 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22e40 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22e60 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
22e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22e80 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
22e90 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
22ea0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
22eb0 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  NSI */.#endif /*
22ec0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
22ed0 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T */..  /*.  ** 
22ee0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
22ef0 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
22f00 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20   directory ends 
22f10 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69  with an appropri
22f20 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  ate.  ** separat
22f30 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  or.  If it does 
22f40 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73  not and there is
22f50 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63   not enough spac
22f60 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20  e left to add.  
22f70 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20  ** one, fail..  
22f80 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b  */.  if( !winMak
22f90 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69  eEndInDirSep(nDi
22fa0 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20  r+1, zBuf) ){.  
22fb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22fc0 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
22fd0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22fe0 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
22ff0 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
23000 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
23010 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
23020 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34  "winGetTempname4
23030 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ", 0);.  }..  /*
23040 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  .  ** Check that
23050 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
23060 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
23070 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
23080 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
23090 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c  name in the foll
230a0 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20  owing format:.  
230b0 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70  **.  **   "<temp
230c0 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e  orary_directory>
230d0 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58  /etilqs_XXXXXXXX
230e0 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a  XXXXXXX\0\0".  *
230f0 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72  *.  ** If not, r
23100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23110 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  OR.  The number 
23120 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20  17 is used here 
23130 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
23140 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
23150 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
23160 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20  he 15 character 
23170 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e  random suffix an
23180 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74  d the.  ** two t
23190 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72  railing NUL char
231a0 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e  acters.  The fin
231b0 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  al directory sep
231c0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
231d0 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
231e0 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61  y added if it wa
231f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72  s not already pr
23200 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c  esent..  */.  nL
23210 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
23220 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66  en30(zBuf);.  if
23230 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b  ( (nLen + nPre +
23240 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20   17) > nBuf ){. 
23250 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23260 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41  zBuf);.    OSTRA
23270 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23280 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
23290 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
232a0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
232b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
232c0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
232d0 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  5", 0);.  }..  s
232e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
232f0 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42  nBuf-16-nLen, zB
23300 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f  uf+nLen, SQLITE_
23310 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
23320 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65  );..  j = sqlite
23330 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
23340 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
23350 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
23360 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  j]);.  for(i=0; 
23370 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
23380 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28  .    zBuf[j] = (
23390 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
233a0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
233b0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
233c0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a  hars)-1) ];.  }.
233d0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
233e0 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
233f0 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b    *pzBuf = zBuf;
23400 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
23410 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65  MP-FILENAME name
23420 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%s, rc=SQLITE_O
23430 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20  K\n", zBuf));.  
23440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23460 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
23470 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c  med file is real
23480 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  ly a directory. 
23490 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
234a0 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68  .** it is someth
234b0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
234c0 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69   directory, or i
234d0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
234e0 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ind of memory.**
234f0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
23500 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
23510 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
23520 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74  t void *zConvert
23530 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  ed){.  DWORD att
23540 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
23550 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
23560 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  no;..  if( osIsN
23570 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
23580 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
23590 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
235a0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
235b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
235c0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
235d0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
235e0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
235f0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
23600 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
23610 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
23640 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
23650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
23670 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
23680 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
23690 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
236a0 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b  }.    if( !rc ){
236b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
236c0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65   /* Invalid name
236d0 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61  ? */.    }.    a
236e0 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
236f0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
23700 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
23710 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
23720 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
23730 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
23740 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
23750 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
23760 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21  .  return (attr!
23770 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
23780 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74  TRIBUTES) && (at
23790 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
237a0 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a  E_DIRECTORY);.}.
237b0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
237c0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
237d0 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c  t winOpen(.  sql
237e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
237f0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
23800 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61  o get maximum pa
23810 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a  th name length *
23820 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23830 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
23840 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
23850 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
23860 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
23870 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
23880 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
23890 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
238a0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238c0 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
238d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
238e0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
238f0 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
23900 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
23910 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
23920 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
23930 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
23940 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
23950 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
23960 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
23970 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
23980 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
23990 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
239a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
239b0 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
239c0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
239d0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
239e0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
239f0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a10 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
23a20 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
23a30 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
23a40 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46  me = zName; /* F
23a50 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
23a60 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
23a70 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  nt cnt = 0;..  /
23a80 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
23a90 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
23aa0 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
23ab0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
23ac0 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
23ad0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23ae0 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
23af0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
23b00 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
23b10 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65    char *zTmpname
23b20 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d   = 0; /* For tem
23b30 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c  porary filename,
23b40 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a   if necessary. *
23b50 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
23b60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
23b70 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
23b80 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
23b90 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
23ba0 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
23bb0 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
23bc0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
23bd0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
23be0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
23bf0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
23c00 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
23c10 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23c20 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
23c30 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
23c40 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
23c50 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23c60 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
23c70 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
23c80 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23c90 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
23ca0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
23cb0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
23cc0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
23cd0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
23ce0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
23cf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23d00 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
23d10 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
23d20 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
23d30 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
23d40 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
23d50 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
23d60 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
23d70 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23d80 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23d90 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
23da0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
23db0 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
23dc0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
23dd0 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
23de0 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
23df0 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
23e00 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
23e10 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
23e20 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
23e30 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
23e40 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
23e50 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
23e60 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
23e70 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
23e80 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
23e90 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
23ea0 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
23eb0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
23ec0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
23ed0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
23ee0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
23ef0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
23f00 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
23f10 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
23f20 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
23f30 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
23f40 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
23f50 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
23f60 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
23f70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
23f80 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
23f90 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
23fa0 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
23fb0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
23fc0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
23fd0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
23fe0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
23ff0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
24000 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
24010 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
24020 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
24030 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
24040 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
24050 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
24060 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
24070 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
24080 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
24090 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
240a0 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
240b0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
240c0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
240d0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
240e0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
240f0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
24100 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
24110 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
24120 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24130 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
24140 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24150 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24160 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24170 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
24180 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
24190 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
241a0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
241b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
241c0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
241d0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
241e0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
241f0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
24200 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
24210 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
24220 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24230 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
24240 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
24250 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
24260 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24270 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
24280 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24290 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
242a0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
242b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
242c0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
242d0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
242e0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
242f0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
24300 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
24310 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
24320 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24330 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
24340 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
24350 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  0 );.  memset(pF
24360 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ile, 0, sizeof(w
24370 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c  inFile));.  pFil
24380 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
24390 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69  ANDLE_VALUE;..#i
243a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
243b0 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  T.  if( !zUtf8Na
243c0 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74  me && !sqlite3_t
243d0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
243e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
243f0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20  (SQLITE_ERROR,. 
24400 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f         "sqlite3_
24410 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76  temp_directory v
24420 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  ariable should b
24430 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22  e set for WinRT"
24440 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
24450 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
24460 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
24470 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
24480 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
24490 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
244a0 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
244b0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
244c0 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
244d0 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
244e0 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
244f0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
24500 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
24510 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
24520 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
24540 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
24550 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
24560 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
24570 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
24580 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24590 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
245a0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
245b0 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
245c0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
245d0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
245e0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
245f0 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
24600 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
24610 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
24620 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
24630 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
24640 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
24650 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
24660 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
24670 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24680 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
24690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
246a0 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
246b0 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
246c0 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
246d0 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
246e0 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
246f0 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
24700 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
24710 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
24720 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
24730 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
24740 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
24750 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
24760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
24770 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
24780 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
24790 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
247a0 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
247b0 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
247c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
247d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
247e0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
247f0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
24800 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24810 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
24820 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
24830 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
24840 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24850 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
24860 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
24870 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
24880 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
24890 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
248a0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
248b0 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
248c0 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
248d0 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
248e0 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
248f0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
24900 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
24910 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
24920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
24930 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
24940 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24950 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20  a new file is . 
24960 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c   ** created. SQL
24970 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  ite doesn't use 
24980 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22  it to indicate "
24990 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
249a0 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  " .  ** as it is
249b0 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
249c0 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
249d0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
249e0 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
249f0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
24a00 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
24a10 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
24a20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
24a30 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
24a40 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
24a50 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24a60 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
24a70 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
24a80 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
24a90 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
24aa0 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
24ab0 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
24ac0 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
24ad0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
24ae0 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
24af0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
24b00 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
24b10 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
24b20 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24b30 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
24b40 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
24b50 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
24b60 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
24b70 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
24b80 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
24b90 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
24ba0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
24bb0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24bc0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
24bd0 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
24be0 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
24bf0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
24c00 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
24c10 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
24c20 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
24c50 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24c80 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
24c90 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
24ca0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
24cb0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24cc0 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24cd0 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
24ce0 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
24cf0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
24d00 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
24d10 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
24d20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
24d30 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
24d40 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
24d50 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
24d60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
24d70 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
24d80 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
24d90 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
24da0 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
24db0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
24dc0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
24dd0 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
24de0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
24df0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
24e00 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
24e10 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24e20 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
24e30 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
24e40 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
24e50 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
24e60 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24e70 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
24e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
24e90 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24ea0 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
24eb0 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
24ec0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24ed0 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
24ee0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24ef0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
24f00 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
24f10 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
24f20 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
24f30 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
24f40 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
24f50 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
24f60 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
24f70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
24f80 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24f90 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
24fa0 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
24fb0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
24fc0 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
24fd0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
25000 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
25030 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
25060 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
25090 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
250a0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
250b0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
250e0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
250f0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
25100 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
25110 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
25120 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
25130 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
25140 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
25170 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
251a0 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
251d0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
251e0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
25210 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
25240 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25250 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
25280 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25290 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
252a0 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
252b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
252c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
252d0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
252e0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
252f0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
25300 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
25310 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
25340 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
25370 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
253a0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
253d0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
253e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
25410 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
25440 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
25450 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
25460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25470 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
25480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
25490 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
254a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
254b0 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
254c0 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
254d0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
254e0 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
254f0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
25500 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
25510 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
25520 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
25530 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
25540 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25550 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
25560 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
25570 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
25580 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
25590 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
255a0 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
255b0 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
255c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
255d0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
255e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
255f0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
25600 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
25610 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
25620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
25630 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
25640 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
25650 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
25660 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20  _OPEN_READONLY) 
25670 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
25680 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f         ~(SQLITE_
25690 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
256a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
256b0 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f  E)),.         pO
256c0 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
256d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
256e0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
256f0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
25700 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  }..  if( pOutFla
25710 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gs ){.    if( is
25720 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
25730 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
25740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25750 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
25760 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
25770 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
25780 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
25790 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
257a0 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
257b0 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
257c0 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  %lx, pOutFlags=%
257d0 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64  p, *pOutFlags=%d
257e0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
257f0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
25800 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65  f8Name, dwDesire
25810 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61  dAccess, pOutFla
25820 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a  gs, pOutFlags ?.
25830 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74             *pOut
25840 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49  Flags : 0, (h==I
25850 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25860 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
25870 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53  : "ok"));..#if S
25880 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
25890 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
258a0 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
258b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
258c0 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77        && (rc = w
258d0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
258e0 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53  Name, pFile))!=S
258f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
25900 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
25910 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
25920 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
25930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25940 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
25950 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
25960 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73  -CE-LOCK name=%s
25970 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d  , rc=%s\n", zNam
25980 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
25990 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74  e(rc)));.    ret
259a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
259b0 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
259c0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
259d0 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
259e0 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
259f0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
25a00 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25a10 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ed);.  }..  sqli
25a20 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
25a30 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  e);.  pFile->pMe
25a40 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
25a50 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56  hod;.  pFile->pV
25a60 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69  fs = pVfs;.  pFi
25a70 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28  le->h = h;.  if(
25a80 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20   isReadonly ){. 
25a90 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
25aa0 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52  ags |= WINFILE_R
25ab0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
25ac0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
25ad0 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f  lean(zName, "pso
25ae0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
25af0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
25b00 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
25b10 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
25b20 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70  LE_PSOW;.  }.  p
25b30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
25b40 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
25b50 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
25b60 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  me;.#if SQLITE_M
25b70 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
25b80 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
25b90 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  ULL;.  pFile->pM
25ba0 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
25bb0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
25bc0 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
25bd0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
25be0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
25bf0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
25c00 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
25c10 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  map;.#endif.#if 
25c20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
25c30 52 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 73 71  R_THREADS>0.  sq
25c40 6c 69 74 65 33 54 68 72 65 61 64 43 72 65 61 74  lite3ThreadCreat
25c50 65 28 26 70 46 69 6c 65 2d 3e 70 72 65 43 61 63  e(&pFile->preCac
25c60 68 65 54 68 72 65 61 64 2c 20 77 69 6e 50 72 65  heThread, winPre
25c70 43 61 63 68 65 54 68 72 65 61 64 2c 20 70 46 69  CacheThread, pFi
25c80 6c 65 29 3b 0a 0a 20 20 7b 0a 20 20 20 20 76 6f  le);..  {.    vo
25c90 69 64 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20  id *pOut = 0;.  
25ca0 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a    sqlite3ThreadJ
25cb0 6f 69 6e 28 70 46 69 6c 65 2d 3e 70 72 65 43 61  oin(pFile->preCa
25cc0 63 68 65 54 68 72 65 61 64 2c 20 26 70 4f 75 74  cheThread, &pOut
25cd0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 72  );.    pFile->pr
25ce0 65 43 61 63 68 65 54 68 72 65 61 64 20 3d 20 30  eCacheThread = 0
25cf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
25d00 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
25d10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25d20 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
25d30 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
25d40 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69  .** Note that Wi
25d50 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
25d60 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
25d70 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
25d80 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
25d90 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
25da0 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
25db0 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
25dc0 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
25dd0 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
25de0 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
25df0 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
25e00 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
25e10 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
25e20 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
25e30 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
25e40 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
25e50 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
25e60 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
25e70 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
25e80 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
25e90 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
25ea0 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
25eb0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
25ec0 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
25ed0 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
25ee0 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
25ef0 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
25f00 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
25f10 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
25f20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
25f30 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
25f40 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
25f50 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
25f60 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
25f70 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
25f80 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
25f90 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
25fa0 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
25fb0 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
25fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
25fd0 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
25fe0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
25ff0 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
26000 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
26010 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61  nt rc;.  DWORD a
26020 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ttr;.  DWORD las
26030 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
26040 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
26050 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26060 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53  ER(pVfs);.  UNUS
26070 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e  ED_PARAMETER(syn
26080 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  cDir);..  Simula
26090 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
260a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
260b0 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  LETE);.  OSTRACE
260c0 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
260d0 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22  s, syncDir=%d\n"
260e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e  , zFilename, syn
260f0 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  cDir));..  zConv
26100 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
26110 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
26120 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
26130 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
26140 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
26150 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
26160 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
26170 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
26180 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
26190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
261a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
261b0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
261c0 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
261d0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
261e0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
261f0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
26200 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
26210 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
26220 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
26230 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
26240 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
26250 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
26260 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
26270 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
262a0 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
262b0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
262c0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
262d0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
262e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
262f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
26300 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
26310 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
26320 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
26330 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
26340 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
26350 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
26360 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
26370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
26380 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
26390 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
263a0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
263b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
263c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
263d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
263e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
263f0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
26400 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
26410 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
26420 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
26430 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
26440 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
26450 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
26460 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
26470 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
26480 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
26490 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
264a0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
264b0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
264c0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
264d0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
264e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
264f0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
26500 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
26510 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
26520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26540 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
26550 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
26570 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
26580 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
26590 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
265a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
265b0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
265c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
265d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
265e0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
265f0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
26600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26610 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
26620 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
26630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26640 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
26650 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
26660 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
26670 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26680 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
26690 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
266a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
266b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
266c0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
266d0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
266e0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
266f0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
26700 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
26710 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
26720 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
26730 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
26740 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
26750 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
26760 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
26770 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
26780 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
26790 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
267a0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
267b0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
267c0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
267d0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
267e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
267f0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
26800 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
26810 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
26820 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26830 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
26840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26860 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
26870 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
26880 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
26890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
268a0 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
268b0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
268c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
268d0 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
268e0 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
268f0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
26900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26910 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
26920 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
26930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26940 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
26950 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
26960 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
26970 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26980 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
26990 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
269a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
269b0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
269c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
269d0 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
269e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
269f0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
26a00 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
26a10 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
26a20 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  E, lastErrno, "w
26a30 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
26a40 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
26a50 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
26a60 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  cnt);.  }.  sqli
26a70 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26a80 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
26a90 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
26aa0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c  , rc=%s\n", zFil
26ab0 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  ename, sqlite3Er
26ac0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
26ad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26ae0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
26af0 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stence and statu
26b00 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
26b10 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
26b20 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
26b30 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
26b40 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
26b50 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
26b60 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
26b70 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
26b80 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
26b90 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
26bc0 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
26bd0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
26be0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
26bf0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
26c00 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
26c10 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
26c20 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
26c30 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
26c40 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
26c50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
26c60 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53  ETER(pVfs);..  S
26c70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
26c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26c90 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
26ca0 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
26cb0 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73  S name=%s, flags
26cc0 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%x, pResOut=%p\
26cd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
26ce0 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c  Filename, flags,
26cf0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a   pResOut));..  z
26d00 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
26d10 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
26d20 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
26d30 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
26d40 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
26d50 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
26d60 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
26d70 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
26d80 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
26d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26da0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
26db0 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
26dc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
26dd0 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
26de0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
26df0 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
26e00 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
26e10 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
26e20 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
26e30 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
26e40 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
26e50 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
26e60 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
26e90 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20  InfoStandard, . 
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
26ec0 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
26ed0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
26ee0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
26ef0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26f00 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51      /* For an SQ
26f10 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
26f20 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20  TS query, treat 
26f30 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69  a zero-length fi
26f40 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  le.      ** as i
26f50 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
26f60 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
26f70 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73      if(    flags
26f80 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
26f90 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20  EXISTS.         
26fa0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
26fb0 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a  ileSizeHigh==0 .
26fc0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
26fd0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
26fe0 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Low==0 ){.      
26ff0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
27000 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
27010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27020 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
27030 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
27040 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
27050 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
27060 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
27070 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  nt);.      if( l
27080 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
27090 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26  FILE_NOT_FOUND &
270a0 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  & lastErrno!=ERR
270b0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
270c0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
270d0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
270e0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72  rted);.        r
270f0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
27100 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  r(SQLITE_IOERR_A
27110 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f  CCESS, lastErrno
27120 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20  , "winAccess",. 
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
27150 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
27160 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
27170 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
27180 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
27190 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
271a0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
271b0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
271c0 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
271d0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
271e0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
271f0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
27200 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27210 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
27220 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
27230 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
27240 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
27250 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
27260 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
27270 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
27280 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
27290 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61  UTES;.      brea
272a0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
272b0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
272c0 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  ITE:.      rc = 
272d0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
272e0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
272f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61  .             (a
27300 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
27310 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  BUTE_READONLY)==
27320 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
27330 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
27340 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
27350 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
27360 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
27370 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54  sOut = rc;.  OST
27380 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
27390 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25  me=%s, pResOut=%
273a0 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
273b0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
273c0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
273d0 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20  ename, pResOut, 
273e0 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
273f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27400 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
27410 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
27420 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
27430 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
27440 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a   a drive letter.
27450 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
27460 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72   colon character
27470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
27480 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
27490 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e  rAndColon(.  con
274a0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
274b0 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  me.){.  return (
274c0 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28   sqlite3Isalpha(
274d0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26  zPathname[0]) &&
274e0 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27   zPathname[1]=='
274f0 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  :' );.}../*.** R
27500 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
27510 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
27520 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
27530 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74  d be used verbat
27540 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a  im.  If.** non-z
27550 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
27560 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
27570 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  on, the calling 
27580 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69  function must si
27590 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20  mply.** use the 
275a0 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61  provided path na
275b0 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d  me verbatim -OR-
275c0 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f   resolve it into
275d0 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d   a full path nam
275e0 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47  e.** using the G
275f0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57  etFullPathName W
27600 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f  in32 API functio
27610 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  n (if available)
27620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
27630 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61   winIsVerbatimPa
27640 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20  thname(.  const 
27650 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
27660 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  ){.  /*.  ** If 
27670 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
27680 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77  arts with a forw
27690 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62  ard slash or a b
276a0 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20  ackslash, it is 
276b0 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65  either.  ** a le
276c0 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20  gal UNC name, a 
276d0 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20  volume relative 
276e0 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f  path, or an abso
276f0 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69  lute path name i
27700 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78  n the.  ** "Unix
27710 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64  " format on Wind
27720 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ows.  There is n
27730 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69  o easy way to di
27740 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77  fferentiate betw
27750 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  een.  ** the fin
27760 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68  al two cases; th
27770 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75  erefore, we retu
27780 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74  rn the safer ret
27790 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55  urn value of TRU
277a0 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63  E.  ** so that c
277b0 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
277c0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d  unction will sim
277d0 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61  ply use it verba
277e0 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28  tim..  */.  if (
277f0 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61   winIsDirSep(zPa
27800 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  thname[0]) ){.  
27810 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
27820 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
27830 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
27840 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74  tarts with a let
27850 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20  ter and a colon 
27860 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76  it is either a v
27870 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74  olume.  ** relat
27880 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61  ive path or an a
27890 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43  bsolute path.  C
278a0 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
278b0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  unction must not
278c0 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  .  ** attempt to
278d0 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72   treat it as a r
278e0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
278f0 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f  e (i.e. they sho
27900 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20  uld simply use. 
27910 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29   ** it verbatim)
27920 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69  ..  */.  if ( wi
27930 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
27940 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65  dColon(zPathname
27950 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27960 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
27970 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74    ** If we get t
27980 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
27990 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  e path name shou
279a0 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ld almost certai
279b0 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a  nly be a purely.
279c0 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e    ** relative on
279d0 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e  e (i.e. not a UN
279e0 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f  C name, not abso
279f0 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f  lute, and not vo
27a00 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a  lume relative)..
27a10 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41    */.  return FA
27a20 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75  LSE;.}../*.** Tu
27a30 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
27a40 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
27a50 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
27a60 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
27a70 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f  pathname into zO
27a80 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69  ut[].  zOut[] wi
27a90 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70  ll be at least p
27aa0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
27ab0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
27ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27ad0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
27ae0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
27af0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
27b00 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
27b10 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
27b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
27b30 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tive,        /* 
27b40 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
27b50 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
27b60 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20    int nFull,    
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
27b90 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
27ba0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75  s */.  char *zFu
27bb0 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
27bc0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
27bd0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23  uffer */.){.  .#
27be0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
27bf0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
27c00 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
27c10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
27c20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27c30 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
27c40 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
27c50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
27c60 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
27c70 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
27c80 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
27c90 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
27ca0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
27cb0 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
27cc0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
27cd0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27ce0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
27cf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
27d00 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
27d10 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
27d20 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
27d30 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
27d40 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
27d50 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
27d60 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
27d70 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
27d80 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
27d90 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
27da0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
27db0 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
27dc0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
27dd0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
27de0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
27df0 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
27e00 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
27e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27e20 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
27e30 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
27e40 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
27e50 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
27e60 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
27e70 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
27e80 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
27e90 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
27ea0 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
27eb0 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
27ec0 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
27ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27ee0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
27ef0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
27f00 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
27f10 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
27f20 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f40 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
27f50 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
27f60 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
27f70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
27f80 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
27f90 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
27fa0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
27fb0 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
27fc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27fd0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
27fe0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27ff0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
28000 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
28010 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
28020 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28030 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
28040 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
28050 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28060 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
28070 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
28080 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
28090 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
280a0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
280b0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
280c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
280d0 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
280e0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
280f0 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
28100 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
28110 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
28120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28130 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
28140 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
28150 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
28160 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
28170 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
28180 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
28190 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
281a0 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
281b0 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
281c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
281d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
281e0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
281f0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
28200 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
28210 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
28220 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
28250 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
28260 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
28270 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
28280 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
28290 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
282a0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
282b0 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
282c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
282d0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
282e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
282f0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
28300 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
28310 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
28320 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
28330 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
28340 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
28350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28360 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
28370 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
28380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
283a0 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
283b0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
283c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20  QLITE_OS_WINRT) 
283d0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
283e0 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
283f0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
28400 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
28410 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
28420 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
28430 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
28440 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
28450 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e  old. */.  /* Win
28460 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f  RT has no way to
28470 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74   convert a relat
28480 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61  ive path to an a
28490 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a  bsolute one. */.
284a0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
284b0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
284c0 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
284d0 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
284e0 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
284f0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
28500 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
28510 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
28520 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
28530 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
28540 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
28550 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
28560 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
28570 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
28580 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
28590 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
285a0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
285b0 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
285c0 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
285d0 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
285e0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
285f0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
28600 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28610 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
28620 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28630 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
28640 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
28650 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28660 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
28670 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
28680 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28690 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
286a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
286b0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
286c0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
286d0 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
286e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
286f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
28700 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
28710 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
28720 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
28730 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
28740 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
28750 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
28760 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
28770 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
28780 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
28790 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
287a0 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
287b0 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
287c0 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
287d0 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
287e0 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
287f0 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
28800 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
28810 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76  '/' && winIsDriv
28820 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
28830 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a  zRelative+1) ){.
28840 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
28850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
28860 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
28870 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
28880 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
28890 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
288a0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
288b0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
288c0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
288d0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
288e0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
288f0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
28900 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
28910 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
28920 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
28930 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
28940 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
28950 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
28960 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
28970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28980 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
28990 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
289a0 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
289b0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
289c0 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
289d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
289e0 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
289f0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
28a00 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
28a10 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
28a20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
28a30 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
28a40 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
28a50 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
28a60 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
28a70 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
28a80 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28a90 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
28aa0 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
28ab0 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
28ac0 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
28ad0 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
28ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
28af0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
28b00 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
28b10 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
28b20 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
28b50 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
28b60 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
28b70 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
28b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28b90 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
28ba0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
28bb0 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
28bc0 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
28bd0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
28be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28bf0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
28c00 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
28c10 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
28c20 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
28c30 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
28c40 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
28c50 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
28c60 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
28c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28c80 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28c90 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28ca0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28cb0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28cc0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28cd0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28d00 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
28d10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
28d20 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
28d30 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
28d40 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
28d50 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
28d60 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
28d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28d80 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28d90 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
28da0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28db0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
28dc0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
28dd0 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
28de0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28df0 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
28e00 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
28e10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
28e20 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28e30 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
28e40 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
28e50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28e60 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
28e70 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
28e80 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28e90 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28ec0 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
28ed0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28ee0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28ef0 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
28f00 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
28f10 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
28f20 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
28f30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
28f40 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
28f50 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
28f60 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
28f70 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
28f80 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
28f90 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
28fa0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
28fb0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
28fc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28fd0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28fe0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28ff0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
29000 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
29010 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
29020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29030 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
29040 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52  llPathname3", zR
29050 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
29060 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
29070 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
29080 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
29090 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
290a0 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
290b0 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
290c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
290d0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
290e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
290f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
29100 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
29110 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
29120 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
29130 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
29140 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
29150 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
29160 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29170 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
29180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29190 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
291a0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
291b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
291c0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
291d0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
29200 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
29210 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
29220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
29230 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
29240 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
29250 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
29260 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
29270 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
29280 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
29290 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
292a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
292b0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
292c0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
292d0 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
292e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
292f0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
29300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29310 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
29320 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29330 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
29340 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
29350 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
29360 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
29370 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
29380 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
29390 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
293a0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
293b0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
293c0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
293d0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
293e0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
293f0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
29400 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
29410 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
29420 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
29430 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
29440 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
29450 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
29460 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29470 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
29480 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
29490 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
294a0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
294b0 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
294c0 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
294d0 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
294e0 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
294f0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
29500 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
29510 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29520 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
29530 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
29540 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
29550 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
29560 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
29570 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
29580 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
29590 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
295a0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
295b0 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
295c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
295d0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
295e0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
295f0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
29600 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
29610 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
29620 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
29630 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
29640 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
29650 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
29660 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29670 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
29680 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
29690 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
296a0 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
296b0 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
296c0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
296d0 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
296e0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
296f0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
29700 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
29710 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
29720 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
29730 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
29740 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
29750 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
29760 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
29770 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
29780 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29790 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
297a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
297b0 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
297c0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
297d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
297e0 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
297f0 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
29800 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
29810 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
29820 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
29830 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
29840 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
29850 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
29860 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
29870 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
29880 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
29890 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
298a0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
298b0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
298c0 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
298d0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
298e0 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
298f0 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
29900 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29910 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
29920 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
29930 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
29940 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
29950 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
29960 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
29970 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
29980 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
29990 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
299a0 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
299b0 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
299c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
299d0 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
299e0 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
299f0 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
29a00 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
29a10 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
29a20 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
29a30 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
29a40 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
29a50 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
29a60 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
29a70 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
29a80 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
29a90 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
29aa0 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
29ab0 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
29ac0 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
29ad0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
29ae0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
29af0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
29b00 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
29b10 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
29b20 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
29b30 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
29b40 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
29b50 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
29b60 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
29b70 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
29b80 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
29b90 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
29ba0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
29bb0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
29bc0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
29bd0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
29be0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29bf0 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
29c00 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
29c10 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
29c20 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
29c30 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
29c40 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
29c50 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
29c60 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
29c70 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
29c80 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65  Time(&x);.    me
29c90 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29ca0 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
29cb0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78     n += sizeof(x
29cc0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
29cd0 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
29ce0 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
29cf0 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65  pid = osGetCurre
29d00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
29d10 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
29d20 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
29d30 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
29d40 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
29d50 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  }.#if SQLITE_OS_
29d60 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65  WINRT.  if( size
29d70 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e  of(ULONGLONG)<=n
29d80 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f  Buf-n ){.    ULO
29d90 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47  NGLONG cnt = osG
29da0 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b  etTickCount64();
29db0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29dc0 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
29dd0 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
29de0 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
29df0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
29e00 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
29e10 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
29e20 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  RD cnt = osGetTi
29e30 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d  ckCount();.    m
29e40 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29e50 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
29e60 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29e70 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
29e80 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f  ndif.  if( sizeo
29e90 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
29ea0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29eb0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b  LARGE_INTEGER i;
29ec0 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66  .    osQueryPerf
29ed0 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
29ee0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  i);.    memcpy(&
29ef0 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a  zBuf[n], &i, siz
29f00 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(i));.    n +
29f10 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d  = sizeof(i);.  }
29f20 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29f30 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   n;.}.../*.** Sl
29f40 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
29f50 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
29f60 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
29f70 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
29f80 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
29f90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29fa0 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
29fb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
29fc0 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
29fd0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
29fe0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29ff0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2a000 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
2a010 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
2a020 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2a030 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
2a040 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
2a050 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
2a060 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
2a070 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2a080 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2a090 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
2a0a0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
2a0b0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
2a0c0 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
2a0d0 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
2a0e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2a0f0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
2a100 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
2a110 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
2a120 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
2a130 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
2a140 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
2a150 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2a160 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2a170 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2a180 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
2a190 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
2a1a0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2a1b0 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2a1c0 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
2a1d0 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
2a1e0 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
2a1f0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
2a200 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
2a210 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
2a220 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
2a230 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
2a240 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
2a250 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
2a260 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
2a270 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2a280 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2a290 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2a2a0 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2a2b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2a2c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2a2d0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2a2e0 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
2a2f0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2a300 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
2a310 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
2a320 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a330 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2a340 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45  iNow){.  /* FILE
2a350 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
2a360 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
2a370 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
2a380 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  e number of .   
2a390 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64    100-nanosecond
2a3a0 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65   intervals since
2a3b0 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31   January 1, 1601
2a3c0 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35   (= JD 2305813.5
2a3d0 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54  ). .  */.  FILET
2a3e0 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63  IME ft;.  static
2a3f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a400 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65  nt64 winFiletime
2a410 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35  Epoch = 23058135
2a420 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2a430 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20  8640000;.#ifdef 
2a440 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
2a450 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a460 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
2a470 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
2a480 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2a490 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  0000;.#endif.  /
2a4a0 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69  * 2^32 - to avoi
2a4b0 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20  d use of LL and 
2a4c0 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20  warnings in gcc 
2a4d0 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
2a4e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2a4f0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20  max32BitValue = 
2a500 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  .      (sqlite3_
2a510 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
2a520 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   + (sqlite3_int6
2a530 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20  4)2000000000 +. 
2a540 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
2a550 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a  t64)294967296;..
2a560 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2a570 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
2a580 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79   time;.  osGetSy
2a590 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
2a5a0 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
2a5b0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
2a5c0 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
2a5d0 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
2a5e0 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  (!osSystemTimeTo
2a5f0 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26  FileTime(&time,&
2a600 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ft)){.    return
2a610 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a620 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74   }.#else.  osGet
2a630 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
2a640 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
2a650 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  dif..  *piNow = 
2a660 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
2a670 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   +.            (
2a680 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
2a690 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
2a6a0 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75  me)*max32BitValu
2a6b0 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
2a6c0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
2a6d0 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65  t64)ft.dwLowDate
2a6e0 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69  Time)/(sqlite3_i
2a6f0 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66  nt64)10000;..#if
2a700 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2a710 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
2a720 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
2a730 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
2a740 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
2a750 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2a760 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
2a770 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
2a780 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2a790 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Vfs);.  return S
2a7a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a7b0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
2a7c0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
2a7d0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
2a7e0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
2a7f0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
2a800 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2a810 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2a820 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
2a830 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
2a840 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2a850 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2a860 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2a870 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a880 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73  winCurrentTime(s
2a890 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a8a0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
2a8b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2a8c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20  lite3_int64 i;. 
2a8d0 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74   rc = winCurrent
2a8e0 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20  TimeInt64(pVfs, 
2a8f0 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29  &i);.  if( !rc )
2a900 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69  {.    *prNow = i
2a910 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d  /86400000.0;.  }
2a920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a930 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ./*.** The idea 
2a940 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
2a950 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65  ction works like
2a960 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
2a970 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  f.** GetLastErro
2a980 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65  r() and FormatMe
2a990 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f  ssage() on Windo
2a9a0 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64  ws (or errno and
2a9b0 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
2a9c0 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72   on Unix). After
2a9d0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
2a9e0 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a  urned by an OS.*
2a9f0 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69  * function, SQLi
2aa00 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
2aa10 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66  nction with zBuf
2aa20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
2aa30 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66  a buffer of nBuf
2aa40 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c   bytes. The OS l
2aa50 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75  ayer should popu
2aa60 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66  late the.** buff
2aa70 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65  er with a nul-te
2aa80 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65  rminated UTF-8 e
2aa90 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73  ncoded error mes
2aaa0 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69  sage.** describi
2aab0 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65  ng the last IO e
2aac0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63  rror to have occ
2aad0 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  urred within the
2aae0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65   calling.** thre
2aaf0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
2ab00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2ab10 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
2ab20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
2ab30 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c  fer,.** it shoul
2ab40 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20  d be truncated. 
2ab50 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2ab60 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f   of xGetLastErro
2ab70 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  r.** is zero if 
2ab80 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2ab90 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
2aba0 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
2abb0 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
2abc0 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
2abd0 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49  as truncated). I
2abe0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  f non-zero is re
2abf0 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  turned,.** then 
2ac00 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2ac10 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ary to include t
2ac20 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  he nul-terminato
2ac30 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  r character.** i
2ac40 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
2ac50 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73  fer..**.** Not s
2ac60 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f  upplying an erro
2ac70 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68  r message will h
2ac80 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65  ave no adverse e
2ac90 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69  ffect.** on SQLi
2aca0 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74  te. It is fine t
2acb0 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d  o have an implem
2acc0 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65  entation that ne
2acd0 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ver.** returns a
2ace0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a  n error message:
2acf0 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65  .**.**   int xGe
2ad00 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2ad10 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2ad20 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2ad30 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65  uf){.**     asse
2ad40 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27  rt(zBuf[0]=='\0'
2ad50 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  );.**     return
2ad60 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a   0;.**   }.**.**
2ad70 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65   However if an e
2ad80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2ad90 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c  supplied, it wil
2ada0 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65  l be incorporate
2adb0 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69  d.** by sqlite i
2adc0 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nto the error me
2add0 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20  ssage available 
2ade0 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e  to the user usin
2adf0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  g.** sqlite3_err
2ae00 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20  msg(), possibly 
2ae10 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73  making IO errors
2ae20 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67   easier to debug
2ae30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ae40 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28  winGetLastError(
2ae50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ae60 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2ae70 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
2ae80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2ae90 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e  s);.  return win
2aea0 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
2aeb0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2aec0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d  , nBuf, zBuf);.}
2aed0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2aee0 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c  ze and deinitial
2aef0 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
2af00 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
2af10 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
2af20 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29  e3_os_init(void)
2af30 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
2af40 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20  e3_vfs winVfs = 
2af50 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2af70 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2af80 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2af90 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2afa0 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2afb0 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
2afc0 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2afd0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aff0 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2b000 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  n32",           
2b010 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2b020 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b030 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2b040 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2b050 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2b060 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2b070 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2b080 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2b090 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2b0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2b0b0 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2b0c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2b0d0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2b0e0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2b0f0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2b100 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2b110 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2b120 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2b130 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2b140 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
2b150 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2b160 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2b170 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2b180 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2b190 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2b1a0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2b1b0 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2b1c0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2b1d0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2b1e0 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
2b1f0 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2b200 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2b210 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
2b220 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
2b230 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2b240 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
2b250 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2b260 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2b270 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
2b280 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2b290 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2b2a0 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
2b2b0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2b2c0 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2b2d0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2b2e0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69  mCall */.  };.#i
2b2f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2b300 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2b310 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2b320 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74  3_vfs winLongPat
2b330 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  hVfs = {.    3, 
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2b360 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2b370 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
2b380 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2b390 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
2b3a0 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2b3b0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2b3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b3d0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2b3e0 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70      "win32-longp
2b3f0 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d  ath",    /* zNam
2b400 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b420 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2b430 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2b440 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
2b450 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
2b460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2b470 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2b480 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2b490 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2b4a0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2b4b0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
2b4c0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2b4d0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2b4e0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2b4f0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2b500 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2b510 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2b520 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2b530 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2b540 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2b550 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2b560 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2b570 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2b580 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2b590 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
2b5a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2b5b0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2b5c0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2b5d0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2b5e0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2b5f0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2b600 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2b610 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2b620 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
2b630 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2b640 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2b650 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2b660 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2b670 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2b680 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2b690 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2b6a0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2b6b0 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
2b6c0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2b6d0 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f    };.#endif..  /
2b6e0 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  * Double-check t
2b6f0 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c  hat the aSyscall
2b700 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65  [] array has bee
2b710 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  n constructed.  
2b720 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53  ** correctly.  S
2b730 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38  ee ticket [bb3a8
2b740 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f  6e890c8e96ab] */
2b750 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
2b760 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d  Size(aSyscall)==
2b770 37 37 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20  77 );..  /* get 
2b780 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63  memory map alloc
2b790 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74  ation granularit
2b7a0 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77  y */.  memset(&w
2b7b0 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69  inSysInfo, 0, si
2b7c0 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f  zeof(SYSTEM_INFO
2b7d0 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ));.#if SQLITE_O
2b7e0 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e  S_WINRT.  osGetN
2b7f0 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28  ativeSystemInfo(
2b800 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2b810 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
2b820 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
2b830 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  o);.#endif.  ass
2b840 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2b850 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
2b860 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61  ularity>0 );.  a
2b870 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
2b880 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29  o.dwPageSize>0 )
2b890 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
2b8a0 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
2b8b0 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69  s, 1);..#if defi
2b8c0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2b8d0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c  _HAS_WIDE).  sql
2b8e0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
2b8f0 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66  r(&winLongPathVf
2b900 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  s, 0);.#endif.. 
2b910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b920 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  K; .}..int sqlit
2b930 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
2b940 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   .#if SQLITE_OS_
2b950 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
2b960 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
2b970 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
2b980 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
2b990 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
2b9a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2b9b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b9c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2b9d0 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.