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

Artifact fe239cec21be60d42c94cac51ba955582ad0b6b1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64  or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57  ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73  AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68   several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61  at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64  vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61  ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51  rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26  LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72  _OMIT_WAL).#  er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65  ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66  quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69  NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45  le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64  _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
06c0: 74 68 65 20 72 65 71 75 69 72 65 64 20 57 69 6e  the required Win
06d0: 64 6f 77 73 20 53 44 4b 20 76 65 72 73 69 6f 6e  dows SDK version
06e0: 20 63 6f 6e 73 74 61 6e 74 73 20 69 66 20 74 68   constants if th
06f0: 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c  ey are not.** al
0700: 72 65 61 64 79 20 61 76 61 69 6c 61 62 6c 65 2e  ready available.
0710: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 54 44 44  .*/.#ifndef NTDD
0720: 49 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65  I_WIN8.#  define
0730: 20 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20   NTDDI_WIN8     
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65     0x06020000.#e
0760: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54  ndif..#ifndef NT
0770: 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 64  DDI_WINBLUE.#  d
0780: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 42  efine NTDDI_WINB
0790: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
07a0: 20 20 20 20 20 20 20 20 30 78 30 36 30 33 30 30          0x060300
07b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  00.#endif../*.**
07c0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 47 65   Check if the Ge
07d0: 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66  tVersionEx[AW] f
07e0: 75 6e 63 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  unctions should 
07f0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64 65  be considered de
0800: 70 72 65 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20  precated.** and 
0810: 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 6d  avoid using them
0820: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 20   in that case.  
0830: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74  It should be not
0840: 65 64 20 68 65 72 65 20 74 68 61 74 20 69 66 20  ed here that if 
0850: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
0860: 74 68 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  the SQLITE_WIN32
0870: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 70 72  _GETVERSIONEX pr
0880: 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
0890: 6f 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 77 68  o is zero.** (wh
08a0: 65 74 68 65 72 20 76 69 61 20 74 68 69 73 20 62  ether via this b
08b0: 6c 6f 63 6b 20 6f 72 20 76 69 61 20 62 65 69 6e  lock or via bein
08c0: 67 20 6d 61 6e 75 61 6c 6c 79 20 73 70 65 63 69  g manually speci
08d0: 66 69 65 64 29 2c 20 74 68 61 74 20 69 6d 70 6c  fied), that impl
08e0: 69 65 73 0a 2a 2a 20 74 68 65 20 75 6e 64 65 72  ies.** the under
08f0: 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
0900: 73 79 73 74 65 6d 20 77 69 6c 6c 20 61 6c 77 61  system will alwa
0910: 79 73 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ys be based on t
0920: 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a  he Windows NT.**
0930: 20 4b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e   Kernel..*/.#ifn
0940: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
0950: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
0960: 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44   if defined(NTDD
0970: 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54  I_VERSION) && NT
0980: 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e  DDI_VERSION >= N
0990: 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20  TDDI_WINBLUE.#  
09a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
09b0: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
09c0: 45 58 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  EX   0.#  else.#
09d0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
09e0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
09f0: 4f 4e 45 58 20 20 20 31 0a 23 20 20 65 6e 64 69  ONEX   1.#  endi
0a00: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
0a10: 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68  This constant sh
0a20: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
0a30: 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20  defined (in the 
0a40: 22 57 69 6e 44 65 66 2e 68 22 20 53 44 4b 20 66  "WinDef.h" SDK f
0a50: 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ile)..*/.#ifndef
0a60: 20 4d 41 58 5f 50 41 54 48 0a 23 20 20 64 65 66   MAX_PATH.#  def
0a70: 69 6e 65 20 4d 41 58 5f 50 41 54 48 20 20 20 20  ine MAX_PATH    
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 28 32 36 30 29 0a 23 65 6e 64 69 66 0a 0a    (260).#endif..
0aa0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61  /*.** Maximum pa
0ab0: 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69  thname length (i
0ac0: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0ad0: 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  32.  This should
0ae0: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20   normally be.** 
0af0: 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69 66  MAX_PATH..*/.#if
0b00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
0b10: 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53  2_MAX_PATH_CHARS
0b20: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0b30: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0b40: 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50 41  _CHARS   (MAX_PA
0b50: 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TH).#endif../*.*
0b60: 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e 74 20  * This constant 
0b70: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
0b80: 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20 74 68  e defined (in th
0b90: 65 20 22 57 69 6e 4e 54 2e 68 22 20 53 44 4b 20  e "WinNT.h" SDK 
0ba0: 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  file)..*/.#ifnde
0bb0: 66 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  f UNICODE_STRING
0bc0: 5f 4d 41 58 5f 43 48 41 52 53 0a 23 20 20 64 65  _MAX_CHARS.#  de
0bd0: 66 69 6e 65 20 55 4e 49 43 4f 44 45 5f 53 54 52  fine UNICODE_STR
0be0: 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 20 20  ING_MAX_CHARS   
0bf0: 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e 64 69     (32767).#endi
0c00: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0c10: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0c20: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
0c30: 57 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f  WinNT.  This sho
0c40: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0c50: 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e  ** UNICODE_STRIN
0c60: 47 5f 4d 41 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a  G_MAX_CHARS..*/.
0c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0c80: 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48  INNT_MAX_PATH_CH
0c90: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0cb0: 41 54 48 5f 43 48 41 52 53 20 20 20 28 55 4e 49  ATH_CHARS   (UNI
0cc0: 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f  CODE_STRING_MAX_
0cd0: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0ce0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0cf0: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0d00: 20 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33   bytes) for Win3
0d10: 32 2e 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48  2.  The MAX_PATH
0d20: 20 6d 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20   macro is in.** 
0d30: 63 68 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77  characters, so w
0d40: 65 20 61 6c 6c 6f 63 61 74 65 20 34 20 62 79 74  e allocate 4 byt
0d50: 65 73 20 70 65 72 20 63 68 61 72 61 63 74 65 72  es per character
0d60: 20 61 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d   assuming worst-
0d70: 63 61 73 65 20 6f 66 0a 2a 2a 20 34 2d 62 79 74  case of.** 4-byt
0d80: 65 73 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72  es-per-character
0d90: 20 66 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69   for UTF8..*/.#i
0da0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0db0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
0dc0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
0dd0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0de0: 48 5f 42 59 54 45 53 20 20 20 28 53 51 4c 49 54  H_BYTES   (SQLIT
0df0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0e00: 5f 43 48 41 52 53 2a 34 29 0a 23 65 6e 64 69 66  _CHARS*4).#endif
0e10: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0e20: 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20  pathname length 
0e30: 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20 57  (in bytes) for W
0e40: 69 6e 4e 54 2e 20 20 54 68 69 73 20 73 68 6f 75  inNT.  This shou
0e50: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a  ld normally be.*
0e60: 2a 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47  * UNICODE_STRING
0e70: 5f 4d 41 58 5f 43 48 41 52 53 20 2a 20 73 69 7a  _MAX_CHARS * siz
0e80: 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a 2f 0a 23  eof(WCHAR)..*/.#
0e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
0ea0: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
0eb0: 45 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ES.#  define SQL
0ec0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0ed0: 54 48 5f 42 59 54 45 53 20 20 20 5c 0a 20 20 20  TH_BYTES   \.   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
0f00: 28 57 43 48 41 52 29 20 2a 20 53 51 4c 49 54 45  (WCHAR) * SQLITE
0f10: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0f20: 43 48 41 52 53 29 0a 23 65 6e 64 69 66 0a 0a 2f  CHARS).#endif../
0f30: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72 72  *.** Maximum err
0f40: 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67 74  or message lengt
0f50: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0f60: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64   WinRT..*/.#ifnd
0f70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0f80: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
0f90: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0fa0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
0fb0: 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29 0a  SG_CHARS (1024).
0fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0fd0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
0fe0: 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  f the character 
0ff0: 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65  should be treate
1000: 64 20 61 73 20 61 20 64 69 72 65 63 74 6f 72 79  d as a directory
1010: 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a  .** separator..*
1020: 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e 49 73 44  /.#ifndef winIsD
1030: 69 72 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20  irSep.#  define 
1040: 77 69 6e 49 73 44 69 72 53 65 70 28 61 29 20 20  winIsDirSep(a)  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1060: 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c 7c 20 28  (a) == '/') || (
1070: 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29 0a 23 65  (a) == '\\')).#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1090: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 77   macro is used w
10a0: 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76 61 72 69  hen a local vari
10b0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 61  able is set to a
10c0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
10d0: 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f  * [sometimes] no
10e0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  t used by the co
10f0: 64 65 20 28 65 2e 67 2e 20 76 69 61 20 63 6f 6e  de (e.g. via con
1100: 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61  ditional compila
1110: 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  tion)..*/.#ifnde
1120: 66 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  f UNUSED_VARIABL
1130: 45 5f 56 41 4c 55 45 0a 23 20 20 64 65 66 69 6e  E_VALUE.#  defin
1140: 65 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c  e UNUSED_VARIABL
1150: 45 5f 56 41 4c 55 45 28 78 29 20 28 76 6f 69 64  E_VALUE(x) (void
1160: 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )(x).#endif../*.
1170: 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 63  ** Returns the c
1180: 68 61 72 61 63 74 65 72 20 74 68 61 74 20 73 68  haracter that sh
1190: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
11a0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
11b0: 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  parator..*/.#ifn
11c0: 64 65 66 20 77 69 6e 47 65 74 44 69 72 53 65 70  def winGetDirSep
11d0: 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65  .#  define winGe
11e0: 74 44 69 72 53 65 70 28 29 20 20 20 20 20 20 20  tDirSep()       
11f0: 20 20 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65           '\\'.#e
1200: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77  ndif../*.** Do w
1210: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c  e need to manual
1220: 6c 79 20 64 65 66 69 6e 65 20 74 68 65 20 57 69  ly define the Wi
1230: 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  n32 file mapping
1240: 20 41 50 49 73 20 66 6f 72 20 75 73 65 20 77 69   APIs for use wi
1250: 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28  th WAL.** mode (
1260: 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73 20  e.g. these APIs 
1270: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  are available in
1280: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 43 45 20   the Windows CE 
1290: 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74 68  SDK; however, th
12a0: 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 70 72  ey.** are not pr
12b0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65 61  esent in the hea
12c0: 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69  der file)?.*/.#i
12d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  f SQLITE_WIN32_F
12e0: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
12f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1300: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a  E_OMIT_WAL)./*.*
1310: 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 66 69 6c  * Two of the fil
1320: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 61  e mapping APIs a
1330: 72 65 20 64 69 66 66 65 72 65 6e 74 20 75 6e 64  re different und
1340: 65 72 20 57 69 6e 52 54 2e 20 20 46 69 67 75 72  er WinRT.  Figur
1350: 65 20 6f 75 74 20 77 68 69 63 68 0a 2a 2a 20 73  e out which.** s
1360: 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23  et we need..*/.#
1370: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1380: 52 54 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41  RT.WINBASEAPI HA
1390: 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61  NDLE WINAPI Crea
13a0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
13b0: 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  mApp(HANDLE, \. 
13c0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
13d0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 55 4c  Y_ATTRIBUTES, UL
13e0: 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 4c 50  ONG, ULONG64, LP
13f0: 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 41 53 45  CWSTR);..WINBASE
1400: 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50  API LPVOID WINAP
1410: 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  I MapViewOfFileF
1420: 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 55  romApp(HANDLE, U
1430: 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 53  LONG, ULONG64, S
1440: 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23 69  IZE_T);.#else.#i
1450: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1470: 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44  .WINBASEAPI HAND
1480: 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65  LE WINAPI Create
1490: 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 48 41 4e  FileMappingA(HAN
14a0: 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f  DLE, LPSECURITY_
14b0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
14c0: 20 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f        DWORD, DWO
14d0: 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 53 54  RD, DWORD, LPCST
14e0: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
14f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1500: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 2a 2f 0a  32_HAS_ANSI) */.
1510: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1520: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1530: 44 45 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  DE).WINBASEAPI H
1540: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
1550: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1560: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
1570: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
1580: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
1590: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
15a0: 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f  CWSTR);.#endif /
15b0: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
15c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
15d0: 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 50 49 20   */..WINBASEAPI 
15e0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
15f0: 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e 44  pViewOfFile(HAND
1600: 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  LE, DWORD, DWORD
1610: 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54 29  , DWORD, SIZE_T)
1620: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1630: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
1640: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
1650: 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20 63  mapping API is c
1660: 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69  ommon to both Wi
1670: 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a  n32 and WinRT..*
1680: 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f  /.WINBASEAPI BOO
1690: 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56 69  L WINAPI UnmapVi
16a0: 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44  ewOfFile(LPCVOID
16b0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16c0: 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41  ITE_WIN32_FILEMA
16d0: 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65  PPING_API && !de
16e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16f0: 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_WAL) */../*.**
1700: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
1710: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
1720: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
1730: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
1740: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1750: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
1760: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1770: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
1780: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1790: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
17a0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
17b0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
17c0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
17d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17e0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
17f0: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
1800: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
1810: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
1820: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1840: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1850: 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63 74 75  ences to structu
1860: 72 65 73 20 75 73 65 64 20 66 6f 72 20 57 41 4c  res used for WAL
1870: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1880: 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d  ct winShm winShm
1890: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
18b0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
18c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
18d0: 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d  inShmNode winShm
18e0: 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67  Node;   /* A reg
18f0: 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ion of shared-me
1900: 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  mory */.#endif..
1910: 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b  /*.** WinCE lack
1920: 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74  s native support
1930: 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   for file lockin
1940: 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  g so we have to 
1950: 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  fake it.** with 
1960: 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72  some code of our
1970: 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   own..*/.#if SQL
1980: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70  ITE_OS_WINCE.typ
1990: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
19a0: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
19b0: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
19c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
19d0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
19e0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
19f0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
1a00: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
1a10: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1a20: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1a30: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
1a40: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1a50: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
1a60: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
1a70: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
1a80: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
1a90: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
1aa0: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
1ab0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
1ac0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
1ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
1ae0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1af0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
1b00: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
1b10: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
1b20: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
1b30: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
1b40: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
1b50: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
1b60: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
1b70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b80: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
1b90: 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66  ; /*** Must be f
1ba0: 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69  irst ***/.  sqli
1bb0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1bc0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75      /* The VFS u
1bd0: 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73  sed to open this
1be0: 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c   file */.  HANDL
1bf0: 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  E h;            
1c00: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
1c10: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 66   accessing the f
1c20: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b  ile */.  u8 lock
1c30: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
1c40: 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
1c50: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1c60: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1c70: 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f    short sharedLo
1c80: 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e  ckByte;   /* Ran
1c90: 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74  domly chosen byt
1ca0: 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61 72  e used as a shar
1cb0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  ed lock */.  u8 
1cc0: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1cd0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20       /* Flags.  
1ce0: 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65  See WINFILE_* be
1cf0: 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  low */.  DWORD l
1d00: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1d10: 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1d20: 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1d30: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1d40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d50: 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68  OMIT_WAL.  winSh
1d60: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1d70: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
1d80: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
1d90: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1da0: 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63  #endif.  const c
1db0: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1dc0: 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d   /* Full pathnam
1dd0: 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a  e of this file *
1de0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e00: 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67  hunk size config
1e10: 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48  ured by FCNTL_CH
1e20: 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20  UNK_SIZE */.#if 
1e30: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1e40: 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65    LPWSTR zDelete
1e50: 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d  OnClose;  /* Nam
1e60: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
1e70: 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  ete when closing
1e80: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75   */.  HANDLE hMu
1e90: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tex;          /*
1ea0: 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20 63   Mutex used to c
1eb0: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
1ec0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20   shared lock */ 
1ed0: 20 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72   .  HANDLE hShar
1ee0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ed;         /* S
1ef0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
1f00: 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f  ment used for lo
1f10: 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  cking */.  wince
1f20: 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20  Lock local;     
1f30: 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61     /* Locks obta
1f40: 69 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e 73  ined by this ins
1f50: 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65  tance of winFile
1f60: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f70: 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a  *shared;      /*
1f80: 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c   Global shared l
1f90: 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ock memory for t
1fa0: 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64  he file  */.#end
1fb0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
1fc0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1fd0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
2000: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
2010: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41  ferences */.  HA
2020: 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2040: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
2050: 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  ing memory mappi
2060: 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ng */.  void *pM
2070: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
2080: 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65        /* Area me
2090: 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
20a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
20b0: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  mapSize;       /
20c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
20d0: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a   mapped region *
20e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
20f0: 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  4 mmapSizeActual
2100: 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65  ; /* Actual size
2110: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
2120: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
2130: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78  nt64 mmapSizeMax
2140: 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
2150: 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  ed FCNTL_MMAP_SI
2160: 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  ZE value */.#end
2170: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
2180: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2190: 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67  winFile.ctrlFlag
21a0: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  s.*/.#define WIN
21b0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
21c0: 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43       0x02   /* C
21d0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
21e0: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
21f0: 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  e WINFILE_PERSIS
2200: 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20 20  T_WAL     0x04  
2210: 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57   /* Persistent W
2220: 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69  AL mode */.#defi
2230: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20  ne WINFILE_PSOW 
2240: 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30 20             0x10 
2250: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41    /* SQLITE_IOCA
2260: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
2270: 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  WRITE */../*. * 
2280: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
2290: 62 75 66 66 65 72 20 75 73 65 64 20 62 79 20 73  buffer used by s
22a0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
22b0: 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a  te_debug().. */.
22c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
22d0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
22e0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
22f0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
2300: 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34  _SIZE   ((int)(4
2310: 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44  096-sizeof(DWORD
2320: 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  ))).#endif../*. 
2330: 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65 64  * The value used
2340: 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69   with sqlite3_wi
2350: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
2360: 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74  y() to specify t
2370: 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20  hat. * the data 
2380: 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64  directory should
2390: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f   be changed.. */
23a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23b0: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
23c0: 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66  TORY_TYPE.#  def
23d0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
23e0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
23f0: 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a  TYPE (1).#endif.
2400: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
2410: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
2420: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
2430: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
2440: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
2450: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
2460: 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68  ory should be ch
2470: 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64  anged.. */.#ifnd
2480: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2490: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
24a0: 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  YPE.#  define SQ
24b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
24c0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28  DIRECTORY_TYPE (
24d0: 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  2).#endif../*. *
24e0: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
24f0: 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  h SQLITE_WIN32_M
2500: 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73  ALLOC on Windows
2510: 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68  , we will use th
2520: 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e  e. * various Win
2530: 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e 63  32 API heap func
2540: 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  tions instead of
2550: 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69   our own.. */.#i
2560: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
2570: 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20  2_MALLOC../*. * 
2580: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a  If this is non-z
2590: 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64  ero, an isolated
25a0: 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72   heap will be cr
25b0: 65 61 74 65 64 20 62 79 20 74 68 65 20 6e 61 74  eated by the nat
25c0: 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c  ive Win32. * all
25d0: 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d  ocator subsystem
25e0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65  ; otherwise, the
25f0: 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73   default process
2600: 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73   heap will be us
2610: 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74  ed.  This. * set
2620: 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65  ting has no effe
2630: 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ct when compilin
2640: 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79  g for WinRT.  By
2650: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69   default, this i
2660: 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64  s enabled. * and
2670: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
2680: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
2690: 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61  d to store all a
26a0: 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20  llocated data.. 
26b0: 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *. *************
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2700: 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74  *. * WARNING: It
2710: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2720: 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   note that when 
2730: 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 73 20  this setting is 
2740: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
2750: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e  . *          win
2760: 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63  MemShutdown func
2770: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
2780: 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69  e.g. by the sqli
2790: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20  te3_shutdown. * 
27a0: 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f           functio
27b0: 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61  n), all data tha
27c0: 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  t was allocated 
27d0: 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74  using the isolat
27e0: 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20  ed heap will. * 
27f0: 20 20 20 20 20 20 20 20 20 62 65 20 66 72 65 65           be free
2800: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e  d immediately an
2810: 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  d any attempt to
2820: 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74   access any of t
2830: 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20  hat freed. *    
2840: 20 20 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20        data will 
2850: 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
2860: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d   result in an im
2870: 6d 65 64 69 61 74 65 20 61 63 63 65 73 73 20 76  mediate access v
2880: 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a  iolation.. *****
2890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69  *********. */.#i
28e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
28f0: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23  32_HEAP_CREATE.#
2900: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2910: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
2920: 45 20 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64  E    (TRUE).#end
2930: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e  if../*. * The in
2940: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
2950: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2960: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
2970: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
2980: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2990: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
29a0: 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  IT_SIZE.#  defin
29b0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
29c0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28  EAP_INIT_SIZE ((
29d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
29e0: 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20  ACHE_SIZE) * \. 
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45        (SQLITE_DE
2a20: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2a30: 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64   + 4194304).#end
2a40: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61  if../*. * The ma
2a50: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68  ximum size of th
2a60: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2a70: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
2a80: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
2a90: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2aa0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
2ab0: 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  X_SIZE.#  define
2ac0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2ad0: 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29  AP_MAX_SIZE  (0)
2ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2af0: 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 74  he extra flags t
2b00: 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74  o use in calls t
2b10: 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61 70  o the Win32 heap
2b20: 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c   APIs.  This val
2b30: 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72  ue may be. * zer
2b40: 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  o for the defaul
2b50: 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a  t behavior.. */.
2b60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2b70: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a  IN32_HEAP_FLAGS.
2b80: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2b90: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2ba0: 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66  S     (0).#endif
2bb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  .../*.** The win
2bc0: 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72  MemData structur
2bd0: 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61  e stores informa
2be0: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
2bf0: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
2c00: 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  fic.** sqlite3_m
2c10: 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65  em_methods imple
2c20: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  mentation..*/.ty
2c30: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
2c40: 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61  MemData winMemDa
2c50: 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65  ta;.struct winMe
2c60: 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20  mData {.#ifndef 
2c70: 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67  NDEBUG.  u32 mag
2c80: 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20  ic1;   /* Magic 
2c90: 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74  number to detect
2ca0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
2cb0: 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66  ption. */.#endif
2cc0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
2cd0: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
2ce0: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
2cf0: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
2d00: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
2d10: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
2d20: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
2d30: 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  n)? */.#ifndef N
2d40: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
2d50: 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c2;   /* Magic n
2d60: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
2d70: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
2d80: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
2d90: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
2da0: 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  UG.#define WINME
2db0: 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30 78 34  M_MAGIC1     0x4
2dc0: 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20  2b2830b.#define 
2dd0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20  WINMEM_MAGIC2   
2de0: 20 20 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e    0xbd4d7cf4.#en
2df0: 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75  dif..static stru
2e00: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
2e10: 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23  n_mem_data = {.#
2e20: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2e30: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23  WINMEM_MAGIC1,.#
2e40: 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41  endif.  NULL, FA
2e50: 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  LSE.#ifndef NDEB
2e60: 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47  UG.  ,WINMEM_MAG
2e70: 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23  IC2.#endif.};..#
2e80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
2e90: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2ea0: 72 74 4d 61 67 69 63 31 28 29 20 61 73 73 65 72  rtMagic1() asser
2eb0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
2ec0: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
2ed0: 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20  AGIC1 ).#define 
2ee0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2ef0: 63 32 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c2() assert( win
2f00: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32  _mem_data.magic2
2f10: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
2f20: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
2f30: 41 73 73 65 72 74 4d 61 67 69 63 28 29 20 20 77  AssertMagic()  w
2f40: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2f50: 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72  1(); winMemAsser
2f60: 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65  tMagic2();.#else
2f70: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
2f80: 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e  ssertMagic().#en
2f90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e  dif..#define win
2fa0: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 20  MemGetDataPtr() 
2fb0: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23   &win_mem_data.#
2fc0: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
2fd0: 48 65 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d  Heap()     win_m
2fe0: 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64  em_data.hHeap.#d
2ff0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f  efine winMemGetO
3000: 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65  wned()    win_me
3010: 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73  m_data.bOwned..s
3020: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
3030: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
3040: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  tes);.static voi
3050: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
3060: 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74  d *pPrior);.stat
3070: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
3080: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
3090: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
30a0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
30b0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
30c0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
30d0: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
30e0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
30f0: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
3100: 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63  AppData);.static
3110: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
3120: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
3130: 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c  ata);..const sql
3140: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3150: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
3160: 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64  in32(void);.#end
3170: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
3180: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
3190: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
31a0: 67 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e  g variable is (n
31b0: 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63  ormally) set onc
31c0: 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e  e and never chan
31d0: 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65  ges.** thereafte
31e0: 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77  r.  It records w
31f0: 68 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61  hether the opera
3200: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3210: 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54  in9x.** or WinNT
3220: 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65  ..**.** 0:   Ope
3230: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e  rating system un
3240: 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f  known..** 1:   O
3250: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3260: 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20  is Win9x..** 2: 
3270: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
3280: 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  em is WinNT..**.
3290: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66  ** In order to f
32a0: 61 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e  acilitate testin
32b0: 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73  g on a WinNT sys
32c0: 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69  tem, the test fi
32d0: 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e  xture.** can man
32e0: 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76  ually set this v
32f0: 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75  alue to 1 to emu
3300: 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76  late Win98 behav
3310: 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ior..*/.#ifdef S
3320: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
3330: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
3340: 20 30 3b 0a 23 65 6c 69 66 20 21 53 51 4c 49 54   0;.#elif !SQLIT
3350: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3370: 26 20 5c 0a 20 20 20 20 20 20 64 65 66 69 6e 65  & \.      define
3380: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3390: 41 53 5f 41 4e 53 49 29 20 26 26 20 64 65 66 69  AS_ANSI) && defi
33a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
33b0: 5f 48 41 53 5f 57 49 44 45 29 0a 73 74 61 74 69  _HAS_WIDE).stati
33c0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  c int sqlite3_os
33d0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69  _type = 0;.#endi
33e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41  f..#ifndef SYSCA
33f0: 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53  LL.#  define SYS
3400: 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73  CALL sqlite3_sys
3410: 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a  call_ptr.#endif.
3420: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3430: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69  tion is not avai
3440: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
3450: 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a   CE or WinRT.. *
3460: 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  /..#if SQLITE_OS
3470: 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
3480: 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66  _OS_WINRT.#  def
3490: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
34a0: 73 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a  sANSI()       1.
34b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
34c0: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
34d0: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
34e0: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
34f0: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
3500: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
3510: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
3520: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
3530: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
3540: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
3550: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
3560: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
3570: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
3580: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
3590: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
35a0: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
35b0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
35c0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
35d0: 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63  in_syscall {.  c
35e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3600: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74  Name of the syst
3610: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
3640: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
3650: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
3660: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3670: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
3680: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
3690: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
36a0: 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49  [] = {.#if !SQLI
36b0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
36c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
36d0: 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73    { "AreFileApis
36e0: 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28  ANSI",         (
36f0: 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41  SYSCALL)AreFileA
3700: 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20  pisANSI,        
3710: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3720: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
3730: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3740: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3760: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
3770: 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  f osAreFileApisA
3780: 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72  NSI.#define osAr
3790: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28  eFileApisANSI ((
37a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f  BOOL(WINAPI*)(VO
37b0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  ID))aSyscall[0].
37c0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
37d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
37e0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
37f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3800: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
3810: 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20  rLowerW",       
3820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3830: 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20  CharLowerW,     
3840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3850: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  lse.  { "CharLow
3860: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3870: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
38a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
38b0: 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28  LowerW ((LPWSTR(
38c0: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
38d0: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
38e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
38f0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
3900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3910: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3920: 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20  { "CharUpperW", 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3940: 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57  SCALL)CharUpperW
3950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
3960: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3970: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
3980: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3990: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
39a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
39b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
39c0: 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c  osCharUpperW ((L
39d0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
39e0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
39f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3a00: 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c  { "CloseHandle",
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3a20: 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c  SCALL)CloseHandl
3a30: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
3a40: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43   },..#define osC
3a50: 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f  loseHandle ((BOO
3a60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
3a70: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70  E))aSyscall[3].p
3a80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3a90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3aa0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3ab0: 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20   "CreateFileA", 
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3ad0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41  CALL)CreateFileA
3ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3af0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3b00: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3b10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3b20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3b30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3b40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3b50: 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48  sCreateFileA ((H
3b60: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3b70: 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  PCSTR,DWORD,DWOR
3b80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
3b90: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3ba0: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
3bb0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
3bc0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
3bd0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3be0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3bf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3c00: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
3c10: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
3c20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3c30: 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  ateFileW,       
3c40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3c50: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3c60: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3c70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3ca0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3cb0: 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ileW ((HANDLE(WI
3cc0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
3cd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
3ce0: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
3cf0: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
3d00: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
3d10: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
3d20: 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c  rent)..#if (!SQL
3d30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
3d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3d50: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
3d60: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
3d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3d80: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
3d90: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
3da0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3db0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3dc0: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
3dd0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
3de0: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3df0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3e20: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
3e30: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28  eFileMappingA ((
3e40: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
3e50: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
3e60: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
3e70: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
3e80: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  ORD,DWORD,LPCSTR
3e90: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
3ea0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3eb0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
3ec0: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
3ed0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3ee0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3ef0: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
3f00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3f10: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
3f20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3f30: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
3f40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3f50: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
3f60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3f70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3fa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3fb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3fc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3fd0: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
3fe0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3ff0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4000: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
4010: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
4020: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4030: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
4040: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4050: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4070: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4080: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
40a0: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
40b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40c0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
40d0: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
40e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4110: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
4120: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
4130: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
4140: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
4150: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
4160: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4170: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4180: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
41a0: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
41b0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
41c0: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
41d0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
41e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
41f0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4240: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4250: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4260: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4270: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4290: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
42a0: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
42b0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
42c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
42d0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
42e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
42f0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4310: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4340: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4350: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4360: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4370: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4380: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4390: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
43a0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
43b0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
43c0: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
43d0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
43e0: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
43f0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4400: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4430: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4440: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4450: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4460: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4470: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4480: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4490: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
44a0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
44b0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
44c0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
44d0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
44e0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
44f0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4500: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4510: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4520: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4560: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4570: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4580: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4590: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
45a0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
45b0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
45c0: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
45d0: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
45e0: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
45f0: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4600: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4610: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4620: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4630: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4640: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4650: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4660: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4670: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4680: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
46a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
46c0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
46d0: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
46e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4710: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4720: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4730: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4740: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4750: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4760: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4770: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4780: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4790: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
47a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
47b0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
47c0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
47d0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
47e0: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
47f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4800: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4810: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4820: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4840: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4850: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
4860: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
4870: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
4880: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
4890: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
48a0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
48b0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
48c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
48d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
48e0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
48f0: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
4900: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
4910: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
4920: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
4930: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4940: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
49a0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
49b0: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
49c0: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
49d0: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
49e0: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
49f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
4a00: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
4a10: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4a20: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
4a30: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4a50: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
4a60: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4a70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4a80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4a90: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4aa0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
4ab0: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
4ac0: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
4ad0: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
4ae0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4af0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b00: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4b10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4b40: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
4b50: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
4b60: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
4b70: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
4b80: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4b90: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4ba0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
4bb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4bc0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4bd0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4be0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4bf0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4c00: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c10: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4c20: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4c30: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
4c40: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4c50: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ca0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
4cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4cc0: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
4cd0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4cf0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
4d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4d20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4d30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d40: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
4d50: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4d60: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
4d70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4d80: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d90: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4da0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4dd0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4de0: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
4df0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4e00: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
4e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4e20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4e40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4e50: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4e60: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
4e70: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4e80: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
4e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4ea0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4eb0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4ef0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4f00: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
4f10: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4f20: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
4f30: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4f40: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4f50: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4f60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f70: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
4f80: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4f90: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
4fa0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4fb0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4fc0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ff0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5000: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
5010: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
5020: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
5030: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
5040: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
5050: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
5060: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5070: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5080: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5090: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
50a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
50b0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
50c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
50d0: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
50f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5120: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
5130: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
5140: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
5150: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
5160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5170: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5180: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
51a0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
51b0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
51c0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
51d0: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
51e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51f0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5200: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5240: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5250: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5260: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5270: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5280: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5290: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
52a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
52c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
52d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
52e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
52f0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5300: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5310: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5320: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5340: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5350: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5390: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
53a0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
53b0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
53c0: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
53d0: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
53e0: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
53f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5400: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5410: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5420: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5440: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5450: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5460: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5470: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5480: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5490: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
54a0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
54b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
54c0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
54d0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
54e0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
54f0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5500: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5510: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5520: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5530: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5540: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5550: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5560: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5570: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5580: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5590: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
55a0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
55b0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
55c0: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
55d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
55e0: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
55f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5600: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5620: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5630: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5670: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5680: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5690: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
56a0: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
56b0: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
56c0: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
56d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
56e0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
56f0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5700: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5710: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5720: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5730: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5740: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5750: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5780: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5790: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
57a0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
57b0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
57c0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
57d0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
57e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
57f0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
5800: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
5810: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5820: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
5830: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
5840: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
5850: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
5860: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5870: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
5880: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5890: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
58a0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
58b0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
58d0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
58e0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5920: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5930: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
5940: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5950: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
5960: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
5970: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5990: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
59a0: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
59b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
59c0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
59d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
59e0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
59f0: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5a30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5a40: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
5a50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5a60: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
5a70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5a80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5a90: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5aa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5ab0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
5ac0: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
5ad0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5ae0: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
5af0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5b00: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5b10: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5b20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5b50: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
5b60: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
5b70: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
5b80: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ba0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5bb0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
5bc0: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
5bd0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
5be0: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
5bf0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5c00: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5c20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5c40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5c50: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
5c60: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
5c70: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
5c80: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
5c90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
5cb0: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
5cc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5cd0: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a  VERSIONEX) && \.
5ce0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
5cf0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d00: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d10: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
5d20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d30: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
5d40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5d50: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5d90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5da0: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5db0: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
5dc0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5dd0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
5de0: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
5df0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5e10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5e20: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
5e30: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66  && \.        def
5e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e50: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5e60: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
5e70: 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b  GETVERSIONEX.  {
5e80: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
5e90: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5ea0: 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45  CALL)GetVersionE
5eb0: 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  xW,           0 
5ec0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5ed0: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5ee0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5f00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f10: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f20: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28  sGetVersionExW (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45  \.        LPOSVE
5f50: 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73  RSIONINFOW))aSys
5f60: 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e  call[35].pCurren
5f70: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c  t)..  { "HeapAll
5f80: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
5f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5fa0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
5fb0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5fc0: 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28  ne osHeapAlloc (
5fd0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
5fe0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5ff0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6000: 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43  )aSyscall[36].pC
6010: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6020: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6030: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6050: 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65  SCALL)HeapCreate
6060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6080: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6090: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
60a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
60b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
60c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
60d0: 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48  osHeapCreate ((H
60e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44  ANDLE(WINAPI*)(D
60f0: 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20  WORD,SIZE_T, \. 
6100: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6110: 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72  Syscall[37].pCur
6120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6140: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6160: 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c  ALL)HeapDestroy,
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
6190: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
61a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61e0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f  HeapDestroy ((BO
61f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6200: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  LE))aSyscall[38]
6210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6220: 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20  "HeapFree",     
6230: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6240: 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20  ALL)HeapFree,   
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6260: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6270: 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e  pFree ((BOOL(WIN
6280: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6290: 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63  RD,LPVOID))aSysc
62a0: 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74  all[39].pCurrent
62b0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c  )..  { "HeapReAl
62c0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
62d0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52    (SYSCALL)HeapR
62e0: 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  eAlloc,         
62f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6300: 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20  e osHeapReAlloc 
6310: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6320: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6330: 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20  PVOID, \.       
6340: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6350: 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[40].pCurrent).
6360: 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c  .  { "HeapSize",
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a  (SYSCALL)HeapSiz
6390: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
63a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
63b0: 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a  osHeapSize ((SIZ
63c0: 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  E_T(WINAPI*)(HAN
63d0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
63e0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
63f0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
6400: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6410: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6420: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6430: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6440: 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c  LL)HeapValidate,
6450: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6460: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6470: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6480: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
64b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
64c0: 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f  eapValidate ((BO
64d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
64e0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
64f0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6500: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
6510: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6520: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6540: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6560: 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63  SCALL)HeapCompac
6570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  t,             0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6590: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28  osHeapCompact ((
65f0: 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41  UINT(WINAPI*)(HA
6600: 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73  NDLE,DWORD))aSys
6610: 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e  call[43].pCurren
6620: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6640: 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e  _ANSI) && !defin
6650: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
6660: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
6670: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6690: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
66a0: 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryA,            
66b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6710: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20   osLoadLibraryA 
6720: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
6730: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
6740: 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74  all[44].pCurrent
6750: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6760: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6770: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6780: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6790: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
67a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
67b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
67c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
67d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
67f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6810: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6860: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
6870: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6880: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
6890: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
68c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
68d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
68e0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
68f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6900: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
6910: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6950: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
6960: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
6970: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
6980: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
6990: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
69b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
69c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
69e0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a10: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6a20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6a60: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
6a70: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
6a80: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6a90: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6aa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6ab0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6ac0: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
6ad0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
6ae0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
6af0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b10: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6b30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6b40: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6b50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6b70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6b90: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
6ba0: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
6bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6bd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6be0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
6bf0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6c00: 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[48].pCurrent)
6c10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
6c20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
6c30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
6c40: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
6c50: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
6c60: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
6c70: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
6c80: 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f  SYSCALL)MapViewO
6c90: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
6ca0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6cb0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
6cc0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6cd0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6cf0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6d00: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
6d10: 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  e ((LPVOID(WINAP
6d20: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6d30: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6d40: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
6d50: 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75  aSyscall[49].pCu
6d60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c  rrent)..  { "Mul
6d70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
6d80: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6d90: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
6da0: 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  har,     0 },..#
6db0: 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79  define osMultiBy
6dc0: 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69  teToWideChar ((i
6dd0: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
6de0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e  ,DWORD,LPCSTR,in
6df0: 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  t,LPWSTR, \.    
6e00: 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c      int))aSyscal
6e10: 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[50].pCurrent).
6e20: 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f  .  { "QueryPerfo
6e30: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20  rmanceCounter", 
6e40: 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65  (SYSCALL)QueryPe
6e50: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
6e60: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
6e70: 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
6e80: 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c  ceCounter ((BOOL
6e90: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
6ea0: 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47       LARGE_INTEG
6eb0: 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  ER*))aSyscall[51
6ec0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6ed0: 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20   "ReadFile",    
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6ef0: 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20  CALL)ReadFile,  
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6f10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65  },..#define osRe
6f20: 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  adFile ((BOOL(WI
6f30: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
6f40: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
6f50: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6f60: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
6f70: 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e  call[52].pCurren
6f80: 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f  t)..  { "SetEndO
6f90: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45     (SYSCALL)SetE
6fb0: 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ndOfFile,       
6fc0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6fd0: 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  ne osSetEndOfFil
6fe0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6ff0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
7000: 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[53].pCurrent)
7010: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7020: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46  _WINRT.  { "SetF
7030: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
7040: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
7050: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20  etFilePointer,  
7060: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7070: 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  se.  { "SetFileP
7080: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
7090: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
70c0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69  .#define osSetFi
70d0: 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52  lePointer ((DWOR
70e0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
70f0: 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a  E,LONG,PLONG, \.
7100: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
7110: 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72  Syscall[54].pCur
7120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7140: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
7150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7160: 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20  ALL)Sleep,      
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65  ,.#else.  { "Sle
7190: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
71a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
71b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
71c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
71d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
71e0: 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e  Sleep ((VOID(WIN
71f0: 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79  API*)(DWORD))aSy
7200: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
7210: 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d  nt)..  { "System
7220: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c  TimeToFileTime",
7230: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73      (SYSCALL)Sys
7240: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
7250: 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  e,    0 },..#def
7260: 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65  ine osSystemTime
7270: 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  ToFileTime ((BOO
7280: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
7290: 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a   SYSTEMTIME*, \.
72a0: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
72b0: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d  ME))aSyscall[56]
72c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
72d0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
72e0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
72f0: 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INRT.  { "Unlock
7300: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7310: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
7320: 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20  ockFile,        
7330: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7340: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7350: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7360: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7390: 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46  ifndef osUnlockF
73a0: 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  ile.#define osUn
73b0: 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  lockFile ((BOOL(
73c0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
73d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
73e0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
73f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  RD))aSyscall[57]
7400: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
7410: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
7420: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c  S_WINCE.  { "Unl
7430: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
7440: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7450: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  UnlockFileEx,   
7460: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7470: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
7480: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7490: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
74c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f  ..#define osUnlo
74d0: 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28  ckFileEx ((BOOL(
74e0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
74f0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
7500: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
7510: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
7520: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
7530: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7540: 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e  _WINCE || !defin
7550: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
7560: 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  AL).  { "UnmapVi
7570: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7580: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
7590: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
75a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
75b0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
75c0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
75d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7600: 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65  efine osUnmapVie
7610: 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  wOfFile ((BOOL(W
7620: 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29  INAPI*)(LPCVOID)
7630: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
7640: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69  urrent)..  { "Wi
7650: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7660: 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  e",     (SYSCALL
7670: 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  )WideCharToMulti
7680: 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Byte,     0 },..
7690: 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68  #define osWideCh
76a0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28  arToMultiByte ((
76b0: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
76c0: 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c  T,DWORD,LPCWSTR,
76d0: 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c  int,LPSTR,int, \
76e0: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c  .        LPCSTR,
76f0: 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c  LPBOOL))aSyscall
7700: 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [60].pCurrent)..
7710: 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c    { "WriteFile",
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7730: 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c  SYSCALL)WriteFil
7740: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7750: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
7760: 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f  sWriteFile ((BOO
7770: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7780: 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  E,LPCVOID,DWORD,
7790: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
77a0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
77b0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
77c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
77d0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
77e0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
77f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7800: 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74  CALL)CreateEvent
7810: 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  ExW,          0 
7820: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7830: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7840: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7850: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7860: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7870: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7880: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20  sCreateEventExW 
7890: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
78a0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
78b0: 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c  RIBUTES,LPCWSTR,
78c0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
78d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
78e0: 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [62].pCurrent)..
78f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7900: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
7910: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
7920: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69      (SYSCALL)Wai
7930: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7940: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
7950: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7960: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7970: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
79a0: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
79b0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44  SingleObject ((D
79c0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
79d0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
79e0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
79f0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
7a00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7a10: 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  RT.  { "WaitForS
7a20: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
7a30: 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46    (SYSCALL)WaitF
7a40: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
7a50: 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ,   0 },.#else. 
7a60: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7a70: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7a80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7ab0: 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69  fine osWaitForSi
7ac0: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44  ngleObjectEx ((D
7ad0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7ae0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
7af0: 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73        BOOL))aSys
7b00: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
7b10: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7b20: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74  S_WINRT.  { "Set
7b30: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
7b40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7b50: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
7b60: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
7b70: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
7b80: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7b90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7bc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
7bd0: 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42  ilePointerEx ((B
7be0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
7bf0: 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45  DLE,LARGE_INTEGE
7c00: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41  R, \.        PLA
7c10: 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52  RGE_INTEGER,DWOR
7c20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e  D))aSyscall[65].
7c30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7c40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7c50: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
7c60: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7c70: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46  ", (SYSCALL)GetF
7c80: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7c90: 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23  HandleEx, 0 },.#
7ca0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
7cb0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7cc0: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
7cd0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7ce0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7cf0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
7d00: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7d10: 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c  yHandleEx ((BOOL
7d20: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7d30: 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45  , \.        FILE
7d40: 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f  _INFO_BY_HANDLE_
7d50: 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f  CLASS,LPVOID,DWO
7d60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d  RD))aSyscall[66]
7d70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7d80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
7d90: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
7da0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
7db0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
7dc0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
7dd0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
7de0: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20  leFromApp,    0 
7df0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
7e00: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7e10: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
7e20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7e30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7e40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7e50: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
7e60: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57  omApp ((LPVOID(W
7e70: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55  INAPI*)(HANDLE,U
7e80: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a  LONG,ULONG64, \.
7e90: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
7ea0: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
7eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7ec0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7ed0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7ef0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c  ALL)CreateFile2,
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7f10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7f20: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
7f30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7f50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7f60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7f70: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41  CreateFile2 ((HA
7f80: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7f90: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
7fa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7fb0: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32     LPCREATEFILE2
7fc0: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
7fd0: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36  TERS))aSyscall[6
7fe0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
7ff0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8000: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
8010: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8020: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
8030: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8040: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
8050: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  L)LoadPackagedLi
8060: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a  brary,     0 },.
8070: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50  #else.  { "LoadP
8080: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
8090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
80c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
80d0: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
80e0: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  y ((HMODULE(WINA
80f0: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a  PI*)(LPCWSTR, \.
8100: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
8110: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
8120: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8130: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8140: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
8150: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8160: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  LL)GetTickCount6
8170: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  4,          0 },
8180: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
8190: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
81a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
81b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
81c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
81d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
81e0: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28  etTickCount64 ((
81f0: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49  ULONGLONG(WINAPI
8200: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8210: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
8220: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8230: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74  INRT.  { "GetNat
8240: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
8250: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8260: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8270: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
8280: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8290: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
82a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
82d0: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69  define osGetNati
82e0: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  veSystemInfo ((V
82f0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
8300: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
8310: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
8320: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  71].pCurrent)..#
8330: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8340: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
8350: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8360: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
8370: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8380: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20  DebugStringA,   
8390: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
83a0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
83b0: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
83c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
83e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
83f0: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8400: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28  gStringA ((VOID(
8410: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
8420: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
8430: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
8440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8450: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
8460: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8470: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
8480: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8490: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  tringW,      0 }
84a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
84b0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
84c0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
84d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
84e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
84f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8500: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8510: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gW ((VOID(WINAPI
8520: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
8530: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
8540: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  t)..  { "GetProc
8550: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20  essHeap",       
8560: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
8570: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20  rocessHeap,     
8580: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
8590: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48  ne osGetProcessH
85a0: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  eap ((HANDLE(WIN
85b0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
85c0: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e  call[74].pCurren
85d0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
85e0: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
85f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8600: 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74 65  WAL).  { "Create
8610: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
8620: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43 72  pp", (SYSCALL)Cr
8630: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8640: 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c  romApp, 0 },.#el
8650: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
8660: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
8670: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
86a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
86b0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
86c0: 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  App ((HANDLE(WIN
86d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
86e0: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
86f0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55 4c  TY_ATTRIBUTES,UL
8700: 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57  ONG,ULONG64,LPCW
8710: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 35  STR))aSyscall[75
8720: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
8730: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
8740: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
8750: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
8760: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
8770: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
8780: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
8790: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
87a0: 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56  the.** "win32" V
87b0: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
87c0: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
87d0: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
87e0: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
87f0: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
8800: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
8810: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
8820: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
8830: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
8840: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
8850: 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53 79  tic int winSetSy
8860: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
8870: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
8880: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
8890: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
88a0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
88b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
88c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
88d0: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
88e0: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
88f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
8900: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
8910: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
8920: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
8930: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
8940: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
8950: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
8960: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
8970: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
8980: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
8990: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
89a0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
89b0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
89c0: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
89d0: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
89e0: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
89f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
8a00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
8a10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8a20: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
8a30: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
8a40: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
8a50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
8a60: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
8a70: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
8a80: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8a90: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
8aa0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
8ab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
8ac0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
8ad0: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
8ae0: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
8af0: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
8b00: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
8b10: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
8b20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
8b30: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
8b40: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
8b50: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
8b60: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
8b70: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
8b80: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8b90: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
8ba0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
8bb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
8bc0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8bd0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
8be0: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
8bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8c00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8c10: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
8c20: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
8c30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
8c40: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
8c50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8c60: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
8c70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8c80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8ca0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8cb0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
8cc0: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
8cd0: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
8ce0: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
8cf0: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
8d00: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
8d10: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
8d20: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
8d30: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
8d40: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
8d50: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
8d60: 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47  syscall_ptr winG
8d70: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
8d80: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
8d90: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
8da0: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
8db0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
8dc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8dd0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
8de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8df0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8e00: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8e10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8e20: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
8e30: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
8e40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
8e50: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
8e60: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
8e70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
8e80: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
8e90: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
8ea0: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
8eb0: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
8ec0: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
8ed0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8ee0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
8ef0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
8f00: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
8f10: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
8f20: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
8f30: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
8f40: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
8f50: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
8f60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8f70: 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43   *winNextSystemC
8f80: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
8f90: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
8fa0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
8fb0: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
8fc0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
8fd0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
8fe0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
8ff0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
9000: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
9010: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
9020: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
9030: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
9040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9050: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
9060: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
9070: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
9080: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
9090: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
90a0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
90b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
90c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
90d0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
90e0: 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74  * If a Win32 nat
90f0: 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65 65  ive heap has bee
9100: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68  n configured, th
9110: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9120: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 63   attempt to.** c
9130: 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f 6e  ompact it.  Upon
9140: 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
9150: 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74 75  _OK will be retu
9160: 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69 6c  rned.  Upon fail
9170: 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53  ure, one.** of S
9180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c  QLITE_NOMEM, SQL
9190: 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51  ITE_ERROR, or SQ
91a0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 69  LITE_NOTFOUND wi
91b0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
91c0: 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 65   The.** "pnLarge
91d0: 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  st" argument, if
91e0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20   non-zero, will 
91f0: 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75 72  be used to retur
9200: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
9210: 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f 6d  e.** largest com
9220: 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f 63  mitted free bloc
9230: 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20 69  k in the heap, i
9240: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20  n bytes..*/.int 
9250: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63 6f  sqlite3_win32_co
9260: 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49 4e  mpact_heap(LPUIN
9270: 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20 20  T pnLargest){.  
9280: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9290: 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72 67  OK;.  UINT nLarg
92a0: 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c  est = 0;.  HANDL
92b0: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
92c0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
92d0: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
92e0: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
92f0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
9300: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
9310: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9320: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9330: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9340: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9350: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
9360: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
9370: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
9380: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
9390: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
93a0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
93b0: 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  f.#if !SQLITE_OS
93c0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
93d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
93e0: 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65 61   (nLargest=osHea
93f0: 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c 20  pCompact(hHeap, 
9400: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9410: 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b 0a  P_FLAGS))==0 ){.
9420: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
9430: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
9440: 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28 20  rror();.    if( 
9450: 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52  lastErrno==NO_ER
9460: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ROR ){.      sql
9470: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9480: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
9490: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 6e  o HeapCompact (n
94a0: 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d 25  o space), heap=%
94b0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
94c0: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
94d0: 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
94e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
94f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
9500: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9510: 45 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64  E_ERROR, "failed
9520: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20   to HeapCompact 
9530: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
9540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9550: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
9560: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
9570: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  p);.      rc = S
9580: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
9590: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73   }.  }.#else.  s
95a0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
95b0: 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69  E_NOTFOUND, "fai
95c0: 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61  led to HeapCompa
95d0: 63 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  ct, heap=%p",.  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
95f0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20  d*)hHeap);.  rc 
9600: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9610: 44 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  D;.#endif.  if( 
9620: 70 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c  pnLargest ) *pnL
9630: 61 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73  argest = nLarges
9640: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
9650: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69  }../*.** If a Wi
9660: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9670: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
9680: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9690: 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  on will attempt 
96a0: 74 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e  to.** destroy an
96b0: 64 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20  d recreate it.  
96c0: 49 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74  If the Win32 nat
96d0: 69 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20  ive heap is not 
96e0: 69 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a  isolated and/or.
96f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** the sqlite3_m
9700: 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e  emory_used() fun
9710: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
9720: 65 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49  eturn zero, SQLI
9730: 54 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20  TE_BUSY will.** 
9740: 62 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  be returned and 
9750: 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20  no changes will 
9760: 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57  be made to the W
9770: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9780: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9790: 5f 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61  _win32_reset_hea
97a0: 70 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  p(){.  int rc;. 
97b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
97c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
97d0: 73 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d  ster; ) /* The m
97e0: 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78  ain static mutex
97f0: 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   */.  MUTEX_LOGI
9800: 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
9810: 20 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20   *pMem; )    /* 
9820: 54 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69  The memsys stati
9830: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
9840: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
9850: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
9860: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
9870: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
9880: 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ); ).  MUTEX_LOG
9890: 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74  IC( pMem = sqlit
98a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
98b0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
98c0: 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74  _MEM); ).  sqlit
98d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
98e0: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
98f0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
9900: 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73  Mem);.  winMemAs
9910: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69  sertMagic();.  i
9920: 66 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  f( winMemGetHeap
9930: 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d  ()!=NULL && winM
9940: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20  emGetOwned() && 
9950: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9960: 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sed()==0 ){.    
9970: 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  /*.    ** At thi
9980: 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73  s point, there s
9990: 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73  hould be no outs
99a0: 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61  tanding memory a
99b0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20  llocations on.  
99c0: 20 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20    ** the heap.  
99d0: 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68  Also, since both
99e0: 20 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20   the master and 
99f0: 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65  memsys locks are
9a00: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
9a10: 2a 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  * being held by 
9a20: 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e  us, no other fun
9a30: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d  ction (i.e. from
9a40: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29   another thread)
9a50: 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62   should.    ** b
9a60: 65 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61  e able to even a
9a70: 63 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20  ccess the heap. 
9a80: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74   Attempt to dest
9a90: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
9aa0: 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c   our.    ** isol
9ab0: 61 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76  ated Win32 nativ
9ac0: 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20  e heap now..    
9ad0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  */.    assert( w
9ae0: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
9af0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
9b00: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  rt( winMemGetOwn
9b10: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
9b20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
9b30: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
9b40: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
9b50: 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61  wn(winMemGetData
9b60: 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65  Ptr());.    asse
9b70: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  rt( winMemGetHea
9b80: 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20  p()==NULL );.   
9b90: 20 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d   assert( !winMem
9ba0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
9bb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9bc0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9bd0: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  =0 );.    rc = w
9be0: 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d  inMemInit(winMem
9bf0: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
9c00: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
9c10: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
9c20: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
9c30: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
9c40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9c50: 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  | winMemGetOwned
9c60: 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  () );.    assert
9c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9c80: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  || sqlite3_memor
9c90: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
9ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20   }else{.    /*. 
9cb0: 20 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20     ** The Win32 
9cc0: 6e 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e  native heap cann
9cd0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62  ot be modified b
9ce0: 65 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65  ecause it may be
9cf0: 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   in use..    */.
9d00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9d10: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BUSY;.  }.  sqli
9d20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9d30: 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  pMem);.  sqlite3
9d40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
9d50: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
9d60: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
9d70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9d80: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
9d90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70  is function outp
9da0: 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65  uts the specifie
9db0: 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20  d (ANSI) string 
9dc0: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62  to the Win32 deb
9dd0: 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61  ugger.** (if ava
9de0: 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69  ilable)..*/..voi
9df0: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
9e00: 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73  write_debug(cons
9e10: 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e  t char *zBuf, in
9e20: 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20  t nBuf){.  char 
9e30: 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57  zDbgBuf[SQLITE_W
9e40: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
9e50: 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d  E];.  int nMin =
9e60: 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49   MIN(nBuf, (SQLI
9e70: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
9e80: 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20  _SIZE - 1)); /* 
9e90: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
9ea0: 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d   */.  if( nMin<-
9eb0: 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f  1 ) nMin = -1; /
9ec0: 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76  * all negative v
9ed0: 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e  alues become -1.
9ee0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   */.  assert( nM
9ef0: 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d  in==-1 || nMin==
9f00: 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45  0 || nMin<SQLITE
9f10: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
9f20: 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e  IZE );.#if defin
9f30: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9f40: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
9f50: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
9f60: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
9f70: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
9f80: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
9f90: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
9fa0: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
9fb0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
9fc0: 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b  tringA(zDbgBuf);
9fd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73  .  }else{.    os
9fe0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
9ff0: 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  gA(zBuf);.  }.#e
a000: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
a010: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
a020: 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  E).  memset(zDbg
a030: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
a040: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
a050: 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c  E);.  if ( osMul
a060: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
a070: 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72  (.          osAr
a080: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
a090: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
a0a0: 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20  MCP, 0, zBuf,.  
a0b0: 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c          nMin, (L
a0c0: 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53  PWSTR)zDbgBuf, S
a0d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a0e0: 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28  BUF_SIZE/sizeof(
a0f0: 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20  WCHAR))<=0 ){.  
a100: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a110: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
a120: 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44  ingW((LPCWSTR)zD
a130: 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20  bgBuf);.#else.  
a140: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
a150: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
a160: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
a170: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
a180: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
a190: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
a1a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
a1b0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67  derr, "%s", zDbg
a1c0: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
a1d0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a1e0: 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  r, "%s", zBuf);.
a1f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
a200: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a210: 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e  g routine suspen
a220: 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ds the current t
a230: 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61  hread for at lea
a240: 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65  st ms.** millise
a250: 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20  conds.  This is 
a260: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
a270: 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20  e Win32 Sleep() 
a280: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
a290: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
a2a0: 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20  T.static HANDLE 
a2b0: 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
a2c0: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
a2d0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
a2e0: 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63  p(DWORD millisec
a2f0: 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54  onds){.#if SQLIT
a300: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20  E_OS_WINRT.  if 
a310: 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c  ( sleepObj==NULL
a320: 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a   ){.    sleepObj
a330: 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74   = osCreateEvent
a340: 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ExW(NULL, NULL, 
a350: 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e  CREATE_EVENT_MAN
a360: 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20  UAL_RESET,.     
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a380: 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
a390: 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61  RONIZE);.  }.  a
a3a0: 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21  ssert( sleepObj!
a3b0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69  =NULL );.  osWai
a3c0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
a3d0: 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c  Ex(sleepObj, mil
a3e0: 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45  liseconds, FALSE
a3f0: 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65  );.#else.  osSle
a400: 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  ep(milliseconds)
a410: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a420: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
a430: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
a440: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
a450: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
a460: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
a470: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
a480: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
a490: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
a4a0: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
a4b0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
a4c0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
a4d0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
a4e0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
a4f0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
a500: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
a510: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
a520: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
a530: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
a540: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
a550: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
a560: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
a570: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
a580: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
a590: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a5a0: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
a5b0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
a5c0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
a5d0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
a5e0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
a5f0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
a600: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
a610: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
a620: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a630: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
a640: 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51  ERSIONEX) || !SQ
a650: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
a660: 52 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65  RSIONEX.# define
a670: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
a680: 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  elif SQLITE_OS_W
a690: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
a6a0: 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69  S_WINRT || !defi
a6b0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
a6c0: 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66  _HAS_ANSI).# def
a6d0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
a6e0: 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  ).#elif !defined
a6f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
a700: 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65  S_WIDE).# define
a710: 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23   osIsNT()  (0).#
a720: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e  else.  static in
a730: 74 20 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a  t osIsNT(void){.
a740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
a750: 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 23 69  os_type==0 ){.#i
a760: 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f  f defined(NTDDI_
a770: 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44  VERSION) && NTDD
a780: 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44  I_VERSION >= NTD
a790: 44 49 5f 57 49 4e 38 0a 20 20 20 20 20 20 4f 53  DI_WIN8.      OS
a7a0: 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e  VERSIONINFOW sIn
a7b0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
a7c0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
a7d0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
a7e0: 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74  fo);.      osGet
a7f0: 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66  VersionExW(&sInf
a800: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  o);.#else.      
a810: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
a820: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66  Info;.      sInf
a830: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
a840: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
a850: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47  Info);.      osG
a860: 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49  etVersionExA(&sI
a870: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nfo);.#endif.   
a880: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79     sqlite3_os_ty
a890: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61  pe = sInfo.dwPla
a8a0: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41  tformId==VER_PLA
a8b0: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f  TFORM_WIN32_NT ?
a8c0: 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20   2 : 1;.    }.  
a8d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a8e0: 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d  _os_type==2;.  }
a8f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
a900: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
a910: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  LOC./*.** Alloca
a920: 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d  te nBytes of mem
a930: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
a940: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
a950: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  c(int nBytes){. 
a960: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
a970: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
a980: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
a990: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
a9a0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
a9b0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
a9c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
a9d0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
a9e0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
a9f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
aa00: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
aa10: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
aa20: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
aa30: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
aa40: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
aa50: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
aa60: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
aa70: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
aa80: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
aa90: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
aaa0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
aab0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
aac0: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
aad0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
aae0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
aaf0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
ab00: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
ab10: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
ab20: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
ab30: 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73        nBytes, os
ab40: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
ab50: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
ab60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
ab70: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
ab80: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
ab90: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
aba0: 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20  oid *pPrior){.  
abb0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20  HANDLE hHeap;.. 
abc0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
abd0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
abe0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
abf0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
ac00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ac10: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
ac20: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
ac30: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
ac40: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
ac50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
ac60: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
ac70: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
ac80: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
ac90: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
aca0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
acb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
acc0: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b  pPrior ) return;
acd0: 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c   /* Passing NULL
ace0: 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20   to HeapFree is 
acf0: 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20  undefined. */.  
ad00: 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28  if( !osHeapFree(
ad10: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
ad20: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
ad30: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73  pPrior) ){.    s
ad40: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ad50: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
ad60: 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f   to HeapFree blo
ad70: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
ad80: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
ad90: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f         pPrior, o
ada0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
adb0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
adc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
add0: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
ade0: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f  an existing memo
adf0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ry allocation.*/
ae00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
ae10: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
ae20: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
ae30: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
ae40: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
ae50: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
ae60: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
ae70: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
ae80: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
ae90: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
aea0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
aeb0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
aec0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
aed0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
aee0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
aef0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
af00: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
af10: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
af20: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
af30: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
af40: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  r) );.#endif.  a
af50: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
af60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f   );.  if( !pPrio
af70: 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  r ){.    p = osH
af80: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
af90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
afa0: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
afb0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  )nBytes);.  }els
afc0: 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  e{.    p = osHea
afd0: 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  pReAlloc(hHeap, 
afe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
aff0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c  P_FLAGS, pPrior,
b000: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
b010: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29  ;.  }.  if( !p )
b020: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b030: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b040: 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75  "failed to %s %u
b050: 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65   bytes (%lu), he
b060: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
b070: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
b080: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
b090: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
b0a0: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
b0b0: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
b0c0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
b0d0: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
b0e0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
b0f0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
b100: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
b110: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
b120: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
b130: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
b140: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
b150: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
b160: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
b170: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b180: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b190: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b1a0: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b1b0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b1c0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b1d0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b1e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b1f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b200: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b210: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b220: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b230: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b240: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b250: 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  p) );.#endif.  i
b260: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
b270: 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69  ;.  n = osHeapSi
b280: 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ze(hHeap, SQLITE
b290: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b2a0: 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  S, p);.  if( n==
b2b0: 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20  (SIZE_T)-1 ){.  
b2c0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b2d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
b2e0: 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20  led to HeapSize 
b2f0: 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20  block %p (%lu), 
b300: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
b310: 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47            p, osG
b320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
b330: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b340: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b350: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b    return (int)n;
b360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20  .}../*.** Round 
b370: 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a  up a request siz
b380: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  e to the next va
b390: 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  lid allocation s
b3a0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
b3b0: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
b3c0: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
b3d0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n n;.}../*.** In
b3e0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
b3f0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
b400: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
b410: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
b420: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
b430: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
b440: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
b450: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
b460: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
b470: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b480: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b490: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
b4a0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
b4b0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b4c0: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
b4d0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
b4e0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b4f0: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
b500: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
b510: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
b520: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
b530: 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61    DWORD dwInitia
b540: 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  lSize = SQLITE_W
b550: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
b560: 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64  IZE;.    DWORD d
b570: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28  wMaximumSize = (
b580: 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f  DWORD)sqlite3Glo
b590: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b  balConfig.nHeap;
b5a0: 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d  .    if( dwMaxim
b5b0: 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  umSize==0 ){.   
b5c0: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
b5d0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
b5e0: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20  HEAP_MAX_SIZE;. 
b5f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49     }else if( dwI
b600: 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78  nitialSize>dwMax
b610: 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20  imumSize ){.    
b620: 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20    dwInitialSize 
b630: 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b  = dwMaximumSize;
b640: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
b650: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
b660: 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c  osHeapCreate(SQL
b670: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b680: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 77 49 6e              dwIn
b6b0: 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78  itialSize, dwMax
b6c0: 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69  imumSize);.    i
b6d0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
b6e0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20  >hHeap ){.      
b6f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b700: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
b710: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48      "failed to H
b720: 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c  eapCreate (%lu),
b730: 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53   flags=%u, initS
b740: 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65  ize=%lu, maxSize
b750: 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20  =%lu",.         
b760: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b770: 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ), SQLITE_WIN32_
b780: 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e  HEAP_FLAGS, dwIn
b790: 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20  itialSize,.     
b7a0: 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69       dwMaximumSi
b7b0: 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
b7c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b7d0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
b7e0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
b7f0: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
b800: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
b810: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
b820: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
b830: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
b840: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
b850: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
b860: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
b870: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b880: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
b890: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
b8a0: 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29  rocessHeap (%lu)
b8b0: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ", osGetLastErro
b8c0: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r());.    return
b8d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b8e0: 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61   }.  pWinMemData
b8f0: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
b900: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69  ;.  assert( !pWi
b910: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
b920: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
b930: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
b940: 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ->hHeap!=0 );.  
b950: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
b960: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
b970: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b980: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b990: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b9a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b9b0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b9c0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
b9d0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
b9e0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
b9f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
ba00: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
ba10: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
ba20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ba30: 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a  *.** Deinitializ
ba40: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
ba50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
ba60: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
ba70: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
ba80: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
ba90: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
baa0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
bab0: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
bac0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a  mData ) return;.
bad0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bae0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
baf0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
bb00: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
bb10: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
bb20: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
bb30: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61  .  if( pWinMemDa
bb40: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
bb50: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bb60: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
bb70: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bb80: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bb90: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bbb0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bbc0: 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  E).    assert( o
bbd0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
bbe0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bbf0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
bc00: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
bc10: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
bc20: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
bc30: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20  bOwned ){.      
bc40: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72  if( !osHeapDestr
bc50: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  oy(pWinMemData->
bc60: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20  hHeap) ){.      
bc70: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bc80: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
bc90: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72  led to HeapDestr
bca0: 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  oy (%lu), heap=%
bcb0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
bcc0: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
bcd0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
bce0: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  )pWinMemData->hH
bcf0: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eap);.      }.  
bd00: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
bd10: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
bd30: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
bd40: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
bd50: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
bd60: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
bd70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
bd80: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
bd90: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
bda0: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
bdb0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
bdc0: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
bdd0: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
bde0: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
bdf0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
be00: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
be10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
be20: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
be30: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
be40: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
be50: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
be60: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
be70: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
be80: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
be90: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
bea0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
beb0: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74  in32(void){.  st
bec0: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
bed0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77  e3_mem_methods w
bee0: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b  inMemMethods = {
bef0: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  .    winMemMallo
bf00: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65  c,.    winMemFre
bf10: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61  e,.    winMemRea
bf20: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
bf30: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Size,.    winMem
bf40: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e  Roundup,.    win
bf50: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e  MemInit,.    win
bf60: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
bf70: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20   &win_mem_data. 
bf80: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
bf90: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  nMemMethods;.}..
bfa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
bfb0: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
bfc0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
bfd0: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
bfe0: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d  MALLOC, sqlite3M
bff0: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d  emGetWin32());.}
c000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c010: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
c020: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
c030: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
c040: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
c050: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20  code (UTF-16?). 
c060: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c070: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c080: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c090: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
c0a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
c0b0: 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  TR winUtf8ToUnic
c0c0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
c0d0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
c0e0: 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
c0f0: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  R zWideFilename;
c100: 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  ..  nChar = osMu
c110: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
c120: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
c130: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
c140: 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68  L, 0);.  if( nCh
c150: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ar==0 ){.    ret
c160: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69  urn 0;.  }.  zWi
c170: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  deFilename = sql
c180: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
c190: 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69  nChar*sizeof(zWi
c1a0: 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  deFilename[0]) )
c1b0: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c  ;.  if( zWideFil
c1c0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c1d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c1e0: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
c1f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
c200: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
c210: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
c220: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a          nChar);.
c250: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
c260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c270: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
c280: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
c290: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
c2a0: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
c2b0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
c2c0: 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74  onvert Microsoft
c2d0: 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   Unicode to UTF-
c2e0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
c2f0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c300: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
c310: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c320: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
c330: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
c340: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43  nicodeToUtf8(LPC
c350: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
c360: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
c370: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
c380: 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  ame;..  nByte = 
c390: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
c3a0: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
c3b0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c3c0: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
c3d0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c3e0: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
c3f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
c400: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
c410: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
c420: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
c430: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c440: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
c450: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c460: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
c470: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
c480: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
c490: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29             0, 0)
c4c0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c4d0: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
c4e0: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
c4f0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
c500: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
c510: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
c520: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c530: 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f  n ANSI string to
c540: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c550: 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  de, based on the
c560: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65  .** current code
c570: 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f  page settings fo
c580: 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20  r file apis..** 
c590: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
c5a0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
c5b0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
c5c0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
c5d0: 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  3_malloc..*/.sta
c5e0: 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62  tic LPWSTR winMb
c5f0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
c600: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
c610: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
c620: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46  .  LPWSTR zMbcsF
c630: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
c640: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
c650: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
c660: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
c670: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
c680: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c690: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
c6a0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
c6b0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28        0)*sizeof(
c6e0: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42  WCHAR);.  if( nB
c6f0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  yte==0 ){.    re
c700: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  turn 0;.  }.  zM
c710: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  bcsFilename = sq
c720: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
c730: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
c740: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
c750: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
c760: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
c770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c780: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
c790: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
c7a0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
c7b0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
c7c0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
c7f0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
c800: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c810: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
c820: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
c830: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
c840: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
c850: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
c860: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
c870: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
c880: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
c890: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
c8a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
c8b0: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
c8c0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
c8d0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
c8e0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c8f0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
c900: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
c910: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
c920: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
c930: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
c940: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
c950: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
c960: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
c970: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
c980: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
c990: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
c9a0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
c9b0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
c9c0: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
c9d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
c9e0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
c9f0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
ca00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ca10: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
ca20: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
ca30: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
ca40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
ca50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ca60: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
ca70: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
ca80: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
ca90: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
caa0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
cab0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
cae0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
caf0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cb00: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
cb10: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
cb20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
cb30: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
cb40: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
cb50: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
cb60: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
cb70: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
cb80: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
cb90: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cba0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cbb0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
cbc0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
cbd0: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
cbe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
cbf0: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
cc00: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
cc10: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
cc20: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
cc30: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
cc40: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
cc50: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
cc60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cc70: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55    }.  zFilenameU
cc80: 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  tf8 = winUnicode
cc90: 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29  ToUtf8(zTmpWide)
cca0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
ccb0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
ccc0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74  turn zFilenameUt
ccd0: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
cce0: 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75  vert UTF-8 to mu
ccf0: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
cd00: 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65  r string.  Space
cd10: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a   to hold the .**
cd20: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
cd30: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
cd40: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
cd50: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
cd60: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
cd70: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
cd80: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
cd90: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
cda0: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
cdb0: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
cdc0: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
cdd0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
cde0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
cdf0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
ce00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
ce10: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69  ilenameMbcs = wi
ce20: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a  nUnicodeToMbcs(z
ce30: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
ce40: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
ce50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69  e);.  return zFi
ce60: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f  lenameMbcs;.}../
ce70: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ce80: 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61  on sets the data
ce90: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68   directory or th
cea0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
ceb0: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a  ctory based on.*
cec0: 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61  * the provided a
ced0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74  rguments.  The t
cee0: 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ype argument mus
cef0: 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20  t be 1 in order 
cf00: 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61  to set the.** da
cf10: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
cf20: 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  2 in order to se
cf30: 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  t the temporary 
cf40: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20  directory.  The 
cf50: 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65  zValue.** argume
cf60: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
cf70: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
cf80: 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74  to use.  The ret
cf90: 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  urn value will b
cfa0: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  e.** SQLITE_OK i
cfb0: 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
cfc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
cfd0: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
cfe0: 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43  (DWORD type, LPC
cff0: 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20  WSTR zValue){.  
d000: 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f  char **ppDirecto
d010: 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ry = 0;.#ifndef 
d020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d030: 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20  INIT.  int rc = 
d040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
d050: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
d060: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
d070: 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  if.  if( type==S
d080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
d090: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
d0a0: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
d0b0: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61  ry = &sqlite3_da
d0c0: 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  ta_directory;.  
d0d0: 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d  }else if( type==
d0e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
d0f0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
d100: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
d110: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74  ory = &sqlite3_t
d120: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
d130: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70   }.  assert( !pp
d140: 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70  Directory || typ
d150: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d160: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d170: 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  YPE.          ||
d180: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d190: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
d1a0: 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61  RY_TYPE.  );.  a
d1b0: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
d1c0: 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65  ory || sqlite3Me
d1d0: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70  mdebugHasType(*p
d1e0: 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54  pDirectory, MEMT
d1f0: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69  YPE_HEAP) );.  i
d200: 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29  f( ppDirectory )
d210: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c  {.    char *zVal
d220: 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20  ueUtf8 = 0;.    
d230: 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56  if( zValue && zV
d240: 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  alue[0] ){.     
d250: 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69   zValueUtf8 = wi
d260: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
d270: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
d280: 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30   ( zValueUtf8==0
d290: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d2a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d2c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d2d0: 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  *ppDirectory);. 
d2e0: 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20     *ppDirectory 
d2f0: 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20  = zValueUtf8;.  
d300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d310: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
d320: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
d330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ../*.** The retu
d340: 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47  rn value of winG
d350: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
d360: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
d370: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
d380: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
d390: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
d3a0: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
d3b0: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
d3c0: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
d3d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
d3e0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f  LastErrorMsg(DWO
d3f0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e  RD lastErrno, in
d400: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
d410: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
d420: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
d430: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
d440: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
d450: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
d460: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
d470: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
d480: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
d490: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
d4a0: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
d4b0: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
d4c0: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
d4d0: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
d4e0: 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
d4f0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
d500: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52  _WINRT.    WCHAR
d510: 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54   zTempWide[SQLIT
d520: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
d530: 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20  SG_CHARS+1];.   
d540: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
d550: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
d560: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
d570: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
d5a0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
d5b0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
d640: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
d670: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
d680: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d6a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
d6b0: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
d6c0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
d6d0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
d6e0: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
d6f0: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
d700: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
d730: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
d760: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
d770: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
d7c0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
d810: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
d860: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
d870: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
d880: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
d890: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
d8a0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
d8b0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
d8c0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
d8d0: 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ut = winUnicodeT
d8e0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
d8f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d900: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d910: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
d920: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20  _WINRT.      /* 
d930: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
d940: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
d950: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
d960: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
d970: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
d980: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
d990: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
d9a0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
d9b0: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
d9c0: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
d9d0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
d9e0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
d9f0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
da00: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_BUFFER |. 
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
da30: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
da40: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
da70: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
da80: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
db10: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &zTemp,.   
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
db60: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
db70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
db80: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
db90: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
dba0: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
dbb0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
dbc0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
dbd0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
dbe0: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
dbf0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
dc00: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
dc10: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20  loc();.      /* 
dc20: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
dc30: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
dc40: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
dc50: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
dc60: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
dc70: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
dc80: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
dc90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dca0: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
dcb0: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
dcc0: 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74  %lx (%lu)", last
dcd0: 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f  Errno, lastErrno
dce0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dcf0: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75  /* copy a maximu
dd00: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20  m of nBuf chars 
dd10: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  to output buffer
dd20: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
dd30: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
dd40: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  Buf, "%s", zOut)
dd50: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68  ;.    /* free th
dd60: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f  e UTF8 buffer */
dd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dd80: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zOut);.  }.  r
dd90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
dda0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ddb0: 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  on - winLogError
ddc0: 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e  AtLine() - is on
ddd0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
dde0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
ddf0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  winLogError()..*
de00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
de10: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  e is invoked aft
de20: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
de30: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
de40: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73  tion..** It logs
de50: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
de60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
de70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
de80: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
de90: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
dea0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
deb0: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
dec0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
ded0: 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73  m .** FormatMess
dee0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
def0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
df00: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
df10: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
df20: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
df30: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
df40: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
df50: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
df60: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
df70: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
df80: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
df90: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
dfa0: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
dfb0: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
dfc0: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
dfd0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
dfe0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
dff0: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
e000: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
e010: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
e020: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
e030: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
e040: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
e050: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
e060: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
e090: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
e0a0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0c0: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
e0d0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
e0e0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
e0f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e100: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
e110: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
e120: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
e130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e140: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
e150: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
e160: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
e190: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
e1a0: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
e1b0: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
e1c0: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
e1e0: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
e1f0: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
e200: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e220: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
e230: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
e240: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
e250: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
e260: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
e270: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
e280: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
e290: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
e2a0: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
e2b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
e2c0: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
e2d0: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
e2e0: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
e2f0: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
e300: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
e310: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
e320: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
e330: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
e340: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
e350: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
e360: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
e370: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
e380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
e390: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
e3a0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
e3b0: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
e3c0: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
e3d0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
e3e0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
e3f0: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
e400: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a  ably caused by .
e410: 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66  ** antivirus sof
e420: 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65  tware.  Also the
e430: 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62   initial delay b
e440: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
e450: 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65  retry..** The de
e460: 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69  lay increases li
e470: 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68  nearly with each
e480: 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64   retry..*/.#ifnd
e490: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
e4a0: 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65  IOERR_RETRY.# de
e4b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
e4c0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30  2_IOERR_RETRY 10
e4d0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
e4e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
e4f0: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23  RR_RETRY_DELAY.#
e500: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
e510: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e520: 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66  _DELAY 25.#endif
e530: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
e540: 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49  oerrRetry = SQLI
e550: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e560: 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74  ETRY;.static int
e570: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
e580: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  lay = SQLITE_WIN
e590: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
e5a0: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ELAY;../*.** The
e5b0: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
e5c0: 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73  ry1" macro is us
e5d0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
e5e0: 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  if a particular 
e5f0: 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  I/O.** error cod
e600: 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47  e obtained via G
e610: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73  etLastError() is
e620: 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20   eligible to be 
e630: 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20  retried.  It.** 
e640: 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20  must accept the 
e650: 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44  error code DWORD
e660: 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67   as its only arg
e670: 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64  ument and should
e680: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
e690: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
e6a0: 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65   code is transie
e6b0: 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64  nt in nature and
e6c0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a   the operation.*
e6d0: 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  * responsible fo
e6e0: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  r generating the
e6f0: 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20   original error 
e700: 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70  might succeed up
e710: 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72  on being.** retr
e720: 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65  ied.  The argume
e730: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
e740: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72   should be a var
e750: 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  iable..**.** Add
e760: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63  itionally, a mac
e770: 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65  ro named "winIoe
e780: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79  rrCanRetry2" may
e790: 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66   be defined.  If
e7a0: 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65   it.** is define
e7b0: 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f  d, it will be co
e7c0: 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65  nsulted only whe
e7d0: 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e  n the macro "win
e7e0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a  IoerrCanRetry1".
e7f0: 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  ** returns zero.
e800: 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43    The "winIoerrC
e810: 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20  anRetry2" macro 
e820: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70  is completely op
e830: 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61  tional and.** ma
e840: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63  y be used to inc
e850: 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  lude additional 
e860: 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74  error codes in t
e870: 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75  he set that shou
e880: 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ld.** result in 
e890: 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20  the failing I/O 
e8a0: 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20  operation being 
e8b0: 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63  retried by the c
e8c0: 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65  aller.  If.** de
e8d0: 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49  fined, the "winI
e8e0: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d  oerrCanRetry2" m
e8f0: 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69  acro must exhibi
e900: 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e  t external seman
e910: 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61  tics.** identica
e920: 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68  l to those of th
e930: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
e940: 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  try1" macro..*/.
e950: 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e  #if !defined(win
e960: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a  IoerrCanRetry1).
e970: 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72  #define winIoerr
e980: 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28  CanRetry1(a) (((
e990: 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53  a)==ERROR_ACCESS
e9a0: 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20  _DENIED)        
e9b0: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
e9e0: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
e9f0: 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20  )    || \.      
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
ea20: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
ea30: 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  ON)       || \. 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
ea60: 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54  )==ERROR_DEV_NOT
ea70: 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c  _EXIST)        |
ea80: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45    ((a)==ERROR_NE
eab0: 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20  TNAME_DELETED)  
eac0: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
eaf0: 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20  OR_SEM_TIMEOUT) 
eb00: 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20           || \.  
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
eb30: 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f  ==ERROR_NETWORK_
eb40: 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65  UNREACHABLE)).#e
eb50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ndif../*.** If a
eb60: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
eb70: 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
eb80: 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
eb90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
eba0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
ebb0: 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
ebc0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
ebd0: 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
ebe0: 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
ebf0: 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
ec00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ec10: 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e  winRetryIoerr(in
ec20: 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52  t *pnRetry, DWOR
ec30: 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57  D *pError){.  DW
ec40: 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73  ORD e = osGetLas
ec50: 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  tError();.  if( 
ec60: 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65  *pnRetry>=winIoe
ec70: 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69  rrRetry ){.    i
ec80: 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
ec90: 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
eca0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ecb0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69   0;.  }.  if( wi
ecc0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28  nIoerrCanRetry1(
ecd0: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
ece0: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69  3_win32_sleep(wi
ecf0: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
ed00: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
ed10: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
ed20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ed30: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69  }.#if defined(wi
ed40: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29  nIoerrCanRetry2)
ed50: 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49  .  else if( winI
ed60: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29  oerrCanRetry2(e)
ed70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ed80: 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49  win32_sleep(winI
ed90: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28  oerrRetryDelay*(
eda0: 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20  1+*pnRetry));.  
edb0: 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20    ++*pnRetry;.  
edc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
edd0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72  #endif.  if( pEr
ede0: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
edf0: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
ee00: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ee10: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
ee20: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
ee30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ee40: 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  inLogIoerr(int n
ee50: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
ee60: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
ee70: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
ee80: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
ee90: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
eea0: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
eeb0: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
eec0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
eed0: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
eee0: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
eef0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
ef00: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
ef60: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
ef70: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
ef80: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
ef90: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
efa0: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
efb0: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
efc0: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
efd0: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
efe0: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
eff0: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
f000: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
f010: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
f020: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
f030: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
f040: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
f050: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
f060: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
f070: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
f080: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
f090: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
f0a0: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
f0b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
f0c0: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
f0d0: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
f0e0: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
f0f0: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
f100: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
f110: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
f120: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
f130: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
f140: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
f150: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
f160: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
f170: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
f180: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
f190: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
f1a0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
f1b0: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
f1c0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
f1d0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
f1e0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
f1f0: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
f200: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
f210: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
f220: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
f230: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
f240: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
f250: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
f260: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
f270: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
f280: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
f290: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
f2a0: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
f2b0: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
f2c0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
f2d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
f2e0: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
f2f0: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
f300: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
f310: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
f320: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
f330: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
f340: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
f350: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
f360: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
f370: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
f380: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
f390: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
f3a0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
f3b0: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
f3c0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
f3d0: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
f3e0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
f3f0: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
f400: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
f410: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
f420: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
f430: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
f440: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
f450: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
f460: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
f470: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
f480: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
f490: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
f4a0: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
f4b0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
f4c0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
f4d0: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
f4e0: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
f4f0: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
f500: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
f510: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
f520: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
f530: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
f540: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
f550: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f560: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
f570: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
f580: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
f590: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
f5a0: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
f5b0: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
f5c0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
f5d0: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
f5e0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
f5f0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
f600: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
f610: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
f620: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
f630: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
f640: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
f650: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
f660: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
f670: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
f680: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
f690: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
f6a0: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
f6b0: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
f6c0: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
f6d0: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
f6e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
f6f0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
f700: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f710: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
f720: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
f730: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
f740: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
f750: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f760: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
f770: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
f7a0: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
f7b0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
f7c0: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
f7d0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
f7e0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
f7f0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
f800: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
f810: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
f820: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
f830: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
f840: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
f850: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
f860: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
f870: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
f880: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
f890: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
f8a0: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
f8b0: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
f8c0: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
f8d0: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
f8e0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
f8f0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
f900: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
f910: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
f920: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
f960: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
f970: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
f9b0: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
f9c0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
f9d0: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
f9e0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
f9f0: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
fa00: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
fa10: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
fa20: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
fa30: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
fa40: 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
fa50: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
fa60: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
fa70: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
fa80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
fa90: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
faa0: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
fab0: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
fac0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
fad0: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
fae0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
faf0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
fb00: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
fb10: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
fb20: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
fb30: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
fb40: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
fb50: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
fb60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
fb70: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
fb80: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
fb90: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
fba0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
fbb0: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
fbc0: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
fbd0: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
fbe0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
fbf0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fc00: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
fc10: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
fc20: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
fc30: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
fc40: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
fc50: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
fc60: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
fc70: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
fc80: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
fc90: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
fca0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
fcb0: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
fcc0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
fcd0: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
fce0: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
fcf0: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
fd00: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
fd10: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
fd20: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
fd30: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
fd40: 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
fd50: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
fd60: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
fd70: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
fd80: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
fd90: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
fda0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
fdb0: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
fdc0: 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
fdd0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
fde0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
fdf0: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
fe00: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
fe10: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
fe20: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
fe30: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
fe40: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
fe50: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
fe60: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
fe70: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
fe80: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
fe90: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
fea0: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
feb0: 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20  f( bInit ){.    
fec0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
fed0: 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
fee0: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
fef0: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
ff00: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
ff10: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
ff20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ff30: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
ff40: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
ff50: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
ff60: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
ff70: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
ff80: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
ff90: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
ffa0: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
ffb0: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
ffc0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
ffd0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
ffe0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
fff0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
10000 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
10010 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
10020 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
10030 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
10040 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
10050 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
10060 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
10070 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
10080 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
10090 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
100a0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
100b0 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
100c0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
100d0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
100e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
100f0 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
10100 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
10110 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10120 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
10130 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10140 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
10150 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
10160 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10170 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
10180 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10190 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
101a0 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
101b0 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
101c0 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
101d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
101e0 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
101f0 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70  e */.    osUnmap
10200 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
10210 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f  ->shared);.    o
10220 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
10230 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
10240 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
10250 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
10260 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
10270 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
10280 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f  );    .    osClo
10290 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
102a0 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
102b0 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
102c0 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
102d0 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
102e0 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
102f0 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
10300 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
10310 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
10320 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
10330 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
10340 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10350 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
10360 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
10370 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10380 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
10390 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
103a0 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
103b0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
103c0 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
103d0 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
103e0 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
103f0 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
10400 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
10410 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
10420 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10430 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
10440 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
10450 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
10460 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
10470 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
10480 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
10490 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
104a0 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
104b0 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
104c0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
104d0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
104e0 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
104f0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
10500 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
10510 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
10520 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
10530 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10540 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
10550 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10560 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
10570 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10580 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
10590 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
105a0 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
105b0 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
105c0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
105d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
105e0 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
105f0 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
10600 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10610 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10620 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
10630 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
10640 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
10650 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
10660 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10670 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
10680 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
10690 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
106a0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
106b0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
106c0 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
106d0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
106e0 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
106f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
10700 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10710 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
10720 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
10730 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10740 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10750 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
10760 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
10770 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10780 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
10790 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
107a0 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
107b0 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
107c0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
107d0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
107e0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
107f0 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
10800 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10810 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
10820 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
10830 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
10840 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
10850 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10860 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
10870 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
10880 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10890 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
108a0 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
108b0 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
108c0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
108d0 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
108e0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
108f0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10900 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
10910 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10920 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
10930 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
10940 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10950 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10960 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10970 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
10980 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10990 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
109a0 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
109b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
109c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
109d0 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
109e0 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
109f0 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10a00 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
10a10 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10a20 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
10a30 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
10a40 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10a50 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
10a60 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
10a70 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
10a80 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10a90 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
10aa0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
10ab0 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
10ac0 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
10ad0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
10ae0 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
10af0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
10b00 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
10b10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10b20 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
10b30 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
10b40 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
10b50 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
10b60 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
10b70 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
10b80 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
10b90 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
10ba0 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
10bb0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
10bc0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10bd0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
10be0 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
10bf0 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
10c00 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10c10 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
10c20 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
10c30 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
10c40 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
10c50 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
10c60 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
10c70 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
10c80 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10c90 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
10ca0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10cb0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
10cc0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
10cd0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10ce0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
10cf0 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
10d00 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
10d10 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
10d20 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10d30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10d40 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10d50 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
10d60 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10d80 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10d90 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
10da0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10db0 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
10dc0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
10dd0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
10de0 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
10df0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
10e00 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
10e10 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
10e20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
10e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10e40 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
10e50 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
10e60 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
10e70 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
10e80 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
10e90 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
10ea0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10eb0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10ec0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10ed0 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
10ee0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
10ef0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
10f00 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
10f10 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
10f20 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
10f30 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
10f50 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
10f60 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
10f70 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
10f80 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10f90 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
10fa0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
10fb0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
10fc0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10fd0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10fe0 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
10ff0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11000 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
11010 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
11020 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
11030 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
11040 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11050 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11060 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11070 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11080 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
11090 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
110a0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
110b0 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
110c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
11110 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11120 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
11130 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
11140 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
11150 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
11160 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11170 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
11180 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
11190 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
111a0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
111b0 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
111c0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
111d0 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
111e0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
111f0 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
11200 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
11210 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
11220 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
11230 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11240 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
11250 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11260 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
11270 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
11280 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112a0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
112b0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
112c0 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
112d0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
112e0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
112f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
11300 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
11310 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
11320 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
11330 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11340 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11350 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
11360 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
11370 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
11380 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
11390 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
113a0 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
113b0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
113c0 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
113d0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
113e0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
113f0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
11400 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11410 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
11420 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
11430 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
11440 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
11450 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
11460 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11470 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
11480 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11490 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
114a0 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
114b0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
114c0 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
114d0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
114e0 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
114f0 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
11500 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
11510 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
11520 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
11530 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
11540 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
11550 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
11560 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
11570 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
11580 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
115a0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
115b0 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
115c0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
115d0 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
115e0 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
115f0 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
11600 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
11610 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
11620 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
11630 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
11640 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
11650 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
11660 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
11670 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
11680 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11690 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
116a0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
116b0 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
116c0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
116d0 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
116e0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
11710 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
11720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11770 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
11780 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
11790 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
117a0 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
117b0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
117c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
117d0 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11820 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
11830 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
11840 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
11850 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
11860 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
11870 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
11880 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
11890 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
118a0 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
118b0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
118c0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
118d0 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
118e0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
118f0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
11900 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
11910 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
11920 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
11930 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
11940 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
11950 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
11960 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
11970 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
11980 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
11990 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
119a0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
119b0 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
119c0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
119d0 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
119e0 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
119f0 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
11a00 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
11a10 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
11a20 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a40 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
11a50 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
11a60 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
11a70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
11a80 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
11a90 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
11aa0 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
11ab0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ad0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
11ae0 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
11af0 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
11b00 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
11b10 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
11b20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
11b30 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
11b40 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
11b50 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
11b60 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
11b70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
11b80 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
11b90 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
11ba0 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
11bb0 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
11bc0 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
11bd0 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
11be0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
11bf0 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
11c00 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
11c10 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
11c20 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
11c30 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
11c40 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
11c50 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
11c60 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
11c70 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
11c80 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
11c90 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
11ca0 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
11cb0 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
11cc0 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
11cd0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
11ce0 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  urred, it is als
11cf0 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
11d00 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
11d10 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
11d20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
11d30 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
11d40 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
11d50 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
11d60 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
11d70 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
11d80 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
11d90 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
11da0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11db0 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
11dc0 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
11dd0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
11de0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
11df0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11e00 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
11e10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11e30 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
11e40 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
11e50 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
11e60 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11e70 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
11e80 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
11e90 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11ea0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
11eb0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
11ec0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
11ed0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
11ee0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
11ef0 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
11f00 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
11f10 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
11f20 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
11f30 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
11f40 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
11f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11f60 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
11f70 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
11fa0 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
11fb0 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
11fc0 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
11fd0 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
11fe0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
11ff0 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
12000 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
12010 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
12020 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12030 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
12040 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
12050 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
12060 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
12070 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12080 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12090 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
120a0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
120b0 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
120c0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
120d0 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
120e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
120f0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
12100 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
12110 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
12120 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
12130 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
12140 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
12150 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
12160 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
12170 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
12180 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
12190 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
121a0 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
121b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
121c0 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
121d0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
121e0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
121f0 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
12200 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
12210 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
12220 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
12230 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
12240 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
12250 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
12260 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
12270 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
12280 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
12290 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
122a0 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
122b0 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
122c0 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
122d0 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
122e0 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
122f0 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
12300 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
12310 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
12320 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
12330 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
12340 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
12350 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
12360 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
12370 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
12380 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
12390 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
123a0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
123b0 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
123c0 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
123d0 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
123e0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
123f0 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
12400 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12410 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
12420 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
12430 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
12440 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
12450 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
12460 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
12470 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
12480 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
12490 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
124a0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
124b0 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
124c0 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
124d0 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
124e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
124f0 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
12500 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
12510 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
12520 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
12530 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
12540 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
12550 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
12560 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
12570 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
12580 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
12590 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
125a0 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
125b0 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
125c0 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
125d0 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
125e0 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
125f0 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
12600 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
12610 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
12620 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
12630 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
12640 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
12650 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
12660 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
12670 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
12680 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
12690 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
126a0 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
126b0 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
126c0 66 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20  ffffff .        
126d0 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
126e0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
126f0 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
12700 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
12710 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
12720 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
12730 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
12740 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
12750 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
12760 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
12770 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12780 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
12790 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
127a0 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
127b0 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
127c0 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c  ("CLOSE file=%p,
127d0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
127e0 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a  ->h, rc ? "ok" :
127f0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
12800 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
12810 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
12820 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
12830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
12840 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
12850 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12870 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65  winClose", pFile
12880 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->zPath);.}../*.
12890 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
128a0 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
128b0 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
128c0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
128d0 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
128e0 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
128f0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
12900 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
12910 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
12920 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
12930 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
12940 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
12950 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
12960 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
12970 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
12980 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
12990 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
129a0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
129b0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
129c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
129d0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
129e0 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
129f0 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
12a00 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
12a10 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
12a20 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51  et */.){.#if !SQ
12a30 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12a40 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
12a50 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
12a60 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
12a70 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
12a80 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
12a90 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
12aa0 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
12ab0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
12ac0 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12ae0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
12af0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
12b00 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
12b10 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
12b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12b30 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
12b40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
12b50 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12b60 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
12b70 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
12b80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12b90 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
12ba0 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
12bb0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
12bc0 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
12bd0 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66  p, amount=%d, of
12be0 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
12bf0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12c00 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
12c10 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
12c20 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
12c30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
12c40 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
12c50 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
12c60 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
12c70 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
12c80 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
12c90 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
12ca0 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
12cb0 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
12cc0 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
12cd0 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
12ce0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
12cf0 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
12d00 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
12d10 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
12d20 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
12d30 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
12d40 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
12d50 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
12d60 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c  (("READ-MMAP fil
12d70 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12d80 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
12d90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12dc0 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
12dd0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
12de0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
12df0 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
12e00 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
12e10 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12e20 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
12e30 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
12e40 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
12e50 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
12e60 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
12e70 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
12e80 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
12e90 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12ea0 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
12eb0 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
12ec0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
12ed0 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
12ee0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
12ef0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
12f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
12f10 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
12f20 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
12f30 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
12f40 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
12f50 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
12f60 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
12f70 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
12f80 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
12f90 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
12fa0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
12fb0 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
12fc0 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
12fd0 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
12fe0 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
12ff0 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
13000 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
13010 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
13020 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
13030 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
13040 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
13050 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
13060 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
13070 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13080 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
13090 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
130a0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
130b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
130c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
130d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
130e0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
130f0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
13100 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20  _IOERR_READ\n", 
13110 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13120 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
13130 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
13140 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
13150 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13170 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
13180 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
13190 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
131a0 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
131b0 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
131c0 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
131d0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
131e0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
131f0 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
13200 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
13210 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
13220 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52  nRead);.    OSTR
13230 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
13240 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
13250 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e  ERR_SHORT_READ\n
13260 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13280 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
13290 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  D;.  }..  OSTRAC
132a0 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
132b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
132c0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
132d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
132e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
132f0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
13300 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
13310 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
13320 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
13330 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
13340 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
13350 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
13360 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
13370 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
13380 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
13390 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
133a0 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
133b0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
133c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
133d0 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
133e0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
133f0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
13400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13410 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
13420 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
13430 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
13440 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
13450 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
13460 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
13470 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
13480 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
134b0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
134c0 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20  else false */.  
134d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
134e0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
134f0 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a  /* File handle *
13500 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d  /.  int nRetry =
13510 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13530 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61   retries */..  a
13540 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
13550 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13560 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
13570 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
13580 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
13590 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
135a0 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
135b0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20  SQLITE_FULL);.. 
135c0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
135d0 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
135e0 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
135f0 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
13600 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
13610 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
13620 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
13630 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13640 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
13650 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
13660 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
13670 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
13680 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
13690 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
136a0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
136b0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
136c0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
136d0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
136e0 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
136f0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
13700 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
13710 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
13720 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
13730 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
13740 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
13750 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
13760 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
13770 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50  ACE(("WRITE-MMAP
13780 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13790 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
137a0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
137b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
137c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
137d0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
137e0 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
137f0 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
13800 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
13810 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
13820 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
13830 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
13840 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
13850 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
13860 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
13870 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
13880 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
13890 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
138a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
138b0 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b  E.  rc = winSeek
138c0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
138d0 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
138e0 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65   ){.#else.  {.#e
138f0 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45  ndif.#if !SQLITE
13900 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56  _OS_WINCE.    OV
13910 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
13920 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
13930 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
13940 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
13950 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
13960 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
13970 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
13980 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
13990 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
139a0 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
139b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
139c0 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
139d0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
139e0 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a00 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
13a10 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
13a20 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
13a30 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
13a40 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
13a50 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
13a60 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
13a70 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
13a80 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65  _OS_WINCE.    me
13a90 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
13aa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
13ab0 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
13ac0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
13ad0 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
13ae0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
13af0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
13b00 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
13b10 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13b20 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
13b30 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28  ndif..    while(
13b40 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53   nRem>0 ){.#if S
13b50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13b60 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
13b70 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
13b80 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
13b90 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ite, 0) ){.#else
13ba0 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
13bb0 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
13bc0 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
13bd0 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70  Write, &overlapp
13be0 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  ed) ){.#endif.  
13bf0 20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74        if( winRet
13c00 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
13c10 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
13c20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
13c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57        assert( nW
13c50 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
13c60 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  e<=(DWORD)nRem )
13c70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
13c80 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e  te==0 || nWrite>
13c90 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20  (DWORD)nRem ){. 
13ca0 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
13cb0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13cc0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
13cd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  ak;.      }.#if 
13ce0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
13cf0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
13d00 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
13d10 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13d20 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
13d30 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
13d40 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
13d50 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
13d60 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
13d70 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
13d80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
13d90 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
13da0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
13db0 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
13dc0 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
13dd0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13de0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
13df0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
13e00 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
13e10 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
13e20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13e30 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
13e40 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
13e50 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
13e60 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
13e70 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
13e80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
13e90 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
13ea0 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
13eb0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13ec0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
13ed0 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
13ee0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13ef0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
13f10 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
13f20 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
13f30 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
13f40 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
13f50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
13f60 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  E\n", pFile->h))
13f70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
13f80 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
13f90 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
13fa0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32        "winWrite2
13fd0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13fe0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
13ff0 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
14000 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
14010 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
14020 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
14030 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
14040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14050 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
14060 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
14070 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
14080 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
14090 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
140a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
140b0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
140c0 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
140d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
140e0 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
140f0 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
14100 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
14110 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
14120 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14130 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
14140 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
14150 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
14160 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14170 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14180 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14190 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
141a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
141b0 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
141c0 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
141d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
141e0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
141f0 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
14200 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
14210 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
14220 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
14230 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
14240 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
14250 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
14260 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
14270 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
14280 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
14290 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
142a0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
142b0 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
142c0 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
142d0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
142e0 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
142f0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14300 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
14310 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
14320 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
14330 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
14340 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
14350 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
14360 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
14370 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
14380 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
14390 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
143a0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
143b0 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
143c0 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
143d0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
143e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
143f0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
14400 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14420 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14430 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
14440 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
14450 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
14460 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
14470 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
14480 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
14490 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
144a0 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
144b0 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
144c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
144d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
144e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
144f0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
14500 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
14510 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14520 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
14530 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
14540 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
14550 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
14560 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
14570 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
14580 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
14590 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
145a0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
145b0 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
145c0 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
145d0 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
145e0 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
145f0 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
14600 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
14610 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
14620 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
14630 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
14640 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
14650 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
14660 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
14670 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14680 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14690 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
146a0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
146b0 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
146c0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
146d0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
146e0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
146f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14700 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
14710 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
14720 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
14730 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
14740 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
14750 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
14760 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
14770 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
14780 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
14790 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
147a0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
147b0 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
147c0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
147d0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
147e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
147f0 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
14800 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
14810 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
14820 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
14830 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
14840 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14850 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
14860 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
14870 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
14880 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
14890 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
148a0 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
148b0 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
148c0 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
148d0 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
148e0 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
148f0 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
14900 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
14910 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14920 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
14930 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
14940 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
14950 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
14960 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
14970 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
14980 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
14990 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
149a0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
149b0 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
149c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
149d0 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
149e0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
149f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
14a00 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
14a10 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
14a20 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
14a30 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
14a40 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
14a50 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
14a60 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
14a70 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
14a80 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
14a90 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
14aa0 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
14ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
14ac0 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
14ad0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
14ae0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
14af0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
14b00 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
14b10 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
14b20 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
14b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
14b40 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
14b50 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
14b60 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
14b70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14b80 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
14b90 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
14ba0 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
14bb0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
14bc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
14bd0 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
14be0 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
14bf0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
14c00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14c10 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
14c20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14c30 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
14c40 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
14c50 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
14c60 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
14c70 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
14c80 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
14c90 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
14ca0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
14cb0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14cc0 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
14cd0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
14ce0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
14cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
14d00 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
14d10 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
14d20 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
14d30 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
14d40 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
14d50 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
14d60 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
14d70 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
14d80 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14d90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14da0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
14db0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14dc0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14dd0 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
14de0 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
14df0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14e00 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
14e10 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
14e20 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
14e30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
14e40 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
14e50 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14e60 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14e70 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
14e80 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
14e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
14ea0 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
14eb0 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
14ec0 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
14ed0 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
14ee0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14ef0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
14f00 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
14f10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14f20 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
14f30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14f40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
14f50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14f60 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
14f70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
14f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14f90 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
14fa0 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
14fb0 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
14fc0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
14fd0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
14fe0 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
14ff0 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
15000 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
15010 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
15020 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
15030 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
15040 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
15080 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
15090 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
150a0 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
150b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
150c0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
150d0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
150e0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
150f0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
15100 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
15110 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
15120 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15130 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15140 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
15150 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
15160 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
15170 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
15180 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
15190 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
151a0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
151b0 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
151c0 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
151d0 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
151e0 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
151f0 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
15200 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
15210 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
15220 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
15230 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
15240 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
15250 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
15260 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15270 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
15280 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
15290 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
152a0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
152b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
152c0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
152d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
152e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
152f0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
15300 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
15310 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
15320 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
15330 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
15340 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
15350 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
15360 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
15370 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
15380 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
15390 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
153a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
153b0 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
153c0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
153d0 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
153e0 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
153f0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
15400 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15410 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
15420 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
15430 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
15440 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
15450 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
15460 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
15470 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
15480 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
15490 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
154a0 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
154b0 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
154c0 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
154d0 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
154e0 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
154f0 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
15500 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
15510 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
15520 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
15530 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
15540 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
15550 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
15560 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
15570 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
15580 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
15590 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
155a0 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
155b0 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
155c0 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
155d0 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
155e0 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
155f0 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
15600 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
15610 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15620 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
15630 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
15640 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
15650 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
15660 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
15670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
156a0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
156b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
156c0 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
156d0 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
156e0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
156f0 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
15700 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
15710 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
15720 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
15730 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
15740 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15750 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
15760 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
15770 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
15780 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
15790 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
157a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
157b0 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
157c0 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
157d0 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
157e0 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
157f0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
15800 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
15810 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
15820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15830 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
15840 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
15850 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
15860 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
15870 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
15880 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
15890 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
158a0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
158b0 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
158c0 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
158d0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
158e0 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
158f0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
15900 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
15910 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
15920 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
15930 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
15940 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
15950 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15960 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
15970 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
15980 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
15990 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
159a0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
159b0 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
159c0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
159f0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
15a00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
15a10 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
15a20 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
15a30 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
15a40 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
15a50 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
15a60 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
15a70 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
15a80 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
15a90 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
15aa0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
15ab0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15ac0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
15ad0 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
15b00 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15b10 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15b20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15b30 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
15b40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15b50 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
15b60 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
15b70 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
15b80 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
15b90 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15ba0 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
15bb0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
15bc0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
15bd0 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20  rName(res)));.  
15be0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
15bf0 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
15c00 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
15c10 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64  nt winUnlockRead
15c20 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
15c30 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
15c40 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
15c50 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  no;.  OSTRACE(("
15c60 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
15c70 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
15c80 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
15c90 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
15ca0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
15cb0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
15cc0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15cd0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
15ce0 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
15cf0 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20   0);.  }.#ifdef 
15d00 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
15d10 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
15d20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
15d30 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15d40 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
15d50 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15d60 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15d70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15d80 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74  res==0 && ((last
15d90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15da0 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
15db0 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a  _NOT_LOCKED) ){.
15dc0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15dd0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
15de0 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
15df0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
15e00 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  NLOCK, pFile->la
15e10 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
15e20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
15e30 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
15e40 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
15e50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15e60 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
15e70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
15e80 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
15e90 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20 72  Name(res)));.  r
15ea0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
15eb0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
15ec0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
15ed0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
15ee0 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
15ef0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
15f00 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15f10 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
15f20 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
15f30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
15f40 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
15f50 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
15f60 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
15f70 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15f80 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
15f90 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
15fa0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
15fb0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
15fc0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
15fd0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
15fe0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
15ff0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16000 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16010 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16020 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16030 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
16040 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
16050 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
16060 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
16070 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
16080 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
16090 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
160a0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
160b0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
160c0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
160d0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
160e0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
160f0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16100 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16110 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16120 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16130 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16140 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
16150 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
16160 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16170 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
16180 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
16190 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
161a0 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
161b0 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
161c0 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
161d0 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
161e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
161f0 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
16200 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
16210 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16220 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
16230 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
16240 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
16250 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
16260 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
16270 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
16280 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16290 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
162a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
162b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
162c0 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
162d0 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
162e0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
162f0 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57  /* Result of a W
16300 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
16310 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
16320 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
16330 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
16340 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
16350 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
16360 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
16370 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
16380 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
16390 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
163a0 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
163b0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
163c0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
163d0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
163e0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  no = NO_ERROR;..
163f0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
16400 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
16410 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64  OCK file=%p, old
16420 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77  Lock=%d(%d), new
16430 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Lock=%d\n",.    
16440 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16450 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16460 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
16470 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70  ockByte, locktyp
16480 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
16490 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
164a0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
164b0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
164c0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
164d0 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
164e0 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
164f0 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
16500 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
16510 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
16520 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
16530 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
16540 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
16550 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
16560 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
16570 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20  ACE(("LOCK-HELD 
16580 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16590 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
165a0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
165b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
165c0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
165d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
165e0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
165f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16600 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
16610 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
16620 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
16640 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
16650 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16660 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
16670 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
16680 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
16690 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
166a0 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
166b0 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
166c0 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
166d0 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
166e0 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
166f0 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
16700 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
16710 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
16720 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
16730 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
16740 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
16750 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
16760 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
16770 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
16780 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
16790 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
167a0 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
167b0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
167c0 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
167d0 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
167e0 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
167f0 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
16800 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
16810 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
16820 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
16830 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
16840 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
16850 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
16890 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
168a0 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
168b0 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
168c0 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
168d0 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
168e0 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
168f0 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
16900 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
16910 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
16920 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
16930 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
16940 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
16950 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
16960 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
16970 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
16980 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
16990 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
169a0 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
169b0 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
169c0 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
169d0 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
169e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
169f0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45  STRACE(("LOCK-PE
16a00 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d  NDING-FAIL file=
16a10 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63  %p, count=%d, rc
16a20 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
16a30 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
16a40 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72   cnt, sqlite3Err
16a50 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20 20 20  Name(res)));.   
16a60 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c     if( cnt ) sql
16a70 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
16a80 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  (1);.    }.    g
16a90 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
16aa0 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65  res;.    if( !re
16ab0 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  s ){.      lastE
16ac0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
16ad0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
16ae0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
16af0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
16b00 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16b10 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16b20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
16b30 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
16b40 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
16b50 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47  ;.    res = winG
16b60 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
16b70 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
16b80 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
16b90 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
16ba0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
16bb0 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
16bc0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16be0 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
16bf0 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
16c00 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
16c10 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
16c20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
16c30 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
16c40 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16c50 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16c60 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16c70 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
16c80 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52  ILE_FLAGS, RESER
16c90 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
16ca0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
16cb0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
16cc0 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
16cd0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
16ce0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
16cf0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16d00 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
16d10 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50    /* Acquire a P
16d20 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f  ENDING lock.  */
16d30 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
16d40 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16d50 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65  && res ){.    ne
16d60 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  wLocktype = PEND
16d70 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f  ING_LOCK;.    go
16d80 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
16d90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
16da0 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
16db0 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
16dc0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
16dd0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
16de0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16df0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
16e00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16e10 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
16e20 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
16e30 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  e);.    res = wi
16e40 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16e50 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
16e60 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
16e70 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16ea0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
16eb0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
16ec0 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
16ed0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
16ee0 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
16ef0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
16f00 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47  or();.      winG
16f10 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
16f20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16f30 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
16f40 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
16f50 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
16f60 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
16f70 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
16f80 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
16f90 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
16fa0 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
16fb0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
16fc0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
16fd0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
16fe0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
16ff0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
17000 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
17010 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
17020 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
17030 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
17040 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
17050 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
17060 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
17070 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
17080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
170a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
170b0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
170c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
170d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
170e0 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  CK-FAIL file=%p,
170f0 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d   wanted=%d, got=
17100 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
17110 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
17120 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
17130 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69  ype));.  }.  pFi
17140 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
17150 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a  u8)newLocktype;.
17160 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
17170 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
17180 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
17190 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
171a0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
171b0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
171c0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
171d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
171e0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
171f0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
17200 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
17210 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
17220 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
17230 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
17240 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
17250 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
17260 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
17270 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
17280 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
17290 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
172a0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
172b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
172c0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
172d0 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
172e0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
172f0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
17300 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17310 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
17320 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
17330 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
17340 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
17350 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
17360 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
17370 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73  ResOut));..  ass
17380 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
17390 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
173a0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
173b0 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
173c0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
173d0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
173e0 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c 6f 63  e=%p, rc=%d (loc
173f0 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  al)\n", pFile->h
17400 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  , rc));.  }else{
17410 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
17420 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17430 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17440 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45  EX_FLAGS,RESERVE
17450 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
17460 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
17470 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46        winUnlockF
17480 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
17490 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
174a0 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
174b0 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20    rc = !rc;.    
174c0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
174d0 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
174e0 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  rc=%d (remote)\n
174f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
17500 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
17510 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
17520 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
17530 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
17540 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25  t=%p, *pResOut=%
17550 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  d, rc=SQLITE_OK\
17560 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17570 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74  File->h, pResOut
17580 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
17590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
175a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
175b0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
175c0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
175d0 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b  iptor id to lock
175e0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
175f0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17600 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
17610 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
17620 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
17630 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
17640 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
17650 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
17660 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
17670 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17680 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17690 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
176a0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
176b0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
176c0 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66  utine to fail if
176d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
176e0 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f  ment.** is NO_LO
176f0 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  CK.  If the seco
17700 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
17710 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20  HARED_LOCK then 
17720 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
17730 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
17740 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74  ITE_IOERR;.*/.st
17750 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
17760 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17770 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
17780 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a  e){.  int type;.
17790 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
177a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
177b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
177c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
177d0 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
177e0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
177f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17800 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
17810 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c  CK file=%p, oldL
17820 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c  ock=%d(%d), newL
17830 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
17840 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
17850 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
17860 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
17870 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65  ckByte, locktype
17880 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69  ));.  type = pFi
17890 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
178a0 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
178b0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
178c0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
178d0 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
178e0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
178f0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
17900 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
17910 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e  RED_LOCK && !win
17920 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
17930 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
17940 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
17950 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
17960 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
17970 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
17980 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
17990 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
179a0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
179b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
179c0 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45  LOCK, osGetLastE
179d0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
179f0 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c  winUnlock", pFil
17a00 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
17a10 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
17a20 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
17a30 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
17a40 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
17a50 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
17a60 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
17a70 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
17a80 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
17a90 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17aa0 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
17ab0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  k(pFile);.  }.  
17ac0 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e  if( type>=PENDIN
17ad0 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  G_LOCK ){.    wi
17ae0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17af0 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
17b00 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
17b10 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
17b20 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  type = (u8)lockt
17b30 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
17b40 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
17b50 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
17b60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17b70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17b80 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
17b90 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
17ba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17bb0 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
17bc0 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65  s inititially ne
17bd0 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
17be0 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
17bf0 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
17c00 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
17c10 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
17c20 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
17c30 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
17c40 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
17c50 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
17c60 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
17c70 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
17c80 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
17c90 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
17ca0 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69  id winModeBit(wi
17cb0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  nFile *pFile, un
17cc0 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
17cd0 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
17ce0 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
17cf0 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
17d00 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
17d10 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
17d20 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
17d30 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
17d40 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
17d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17d60 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
17d70 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
17d80 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
17d90 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
17da0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
17db0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
17dc0 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
17dd0 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
17de0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
17df0 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69   char **);.stati
17e00 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
17e10 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74  onst void *);.st
17e20 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
17e30 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
17e40 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  on(const char *)
17e50 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c  ;../*.** Control
17e60 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68   and query of th
17e70 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  e open file hand
17e80 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17e90 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c  t winFileControl
17ea0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17eb0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
17ec0 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c  *pArg){.  winFil
17ed0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
17ee0 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41  ile*)id;.  OSTRA
17ef0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
17f00 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d  %p, op=%d, pArg=
17f10 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
17f20 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73   op, pArg));.  s
17f30 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
17f40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
17f50 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
17f60 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
17f70 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
17f80 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ype;.      OSTRA
17f90 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
17fa0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
17fb0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
17fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
17fe0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
17ff0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
18000 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
18010 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
18020 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
18030 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18040 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18050 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18060 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18080 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18090 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
180a0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
180b0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
180c0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
180d0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
180e0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
180f0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18100 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18120 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18130 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
18140 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
18150 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
18160 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
18170 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
18180 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
18190 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
181a0 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
181b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
181c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
181d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
181e0 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
181f0 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
18200 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
18210 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
18220 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
18230 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18240 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
18250 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
18260 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
18270 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
18280 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
182a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
182b0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
182c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
182d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
182e0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
182f0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
18300 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18310 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18320 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18330 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18340 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18360 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18370 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
18380 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
18390 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
183a0 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
183b0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
183c0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
183d0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
183e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
183f0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18400 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18420 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18430 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
18440 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
18450 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
18460 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
18470 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
18480 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18490 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
184a0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
184b0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
184c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
184d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
184e0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
184f0 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
18500 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
18510 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18520 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
18530 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
18540 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18550 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18560 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18570 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
185a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
185b0 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
185c0 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
185d0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
185e0 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
185f0 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
18600 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
18610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18620 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
18630 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
18640 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
18650 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
18660 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
18670 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
18680 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
18690 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
186a0 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
186b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
186c0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
186d0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
186e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
186f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18700 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18710 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
18720 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
18730 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
18740 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
18750 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
18760 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
18770 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
18780 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
187a0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
187b0 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
187c0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
187d0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
187e0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
187f0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
18800 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
18810 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
18820 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
18830 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
18840 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
18850 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
18860 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
18870 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
18880 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
18890 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
188a0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
188b0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
188c0 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
188d0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
188e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
188f0 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
18900 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
18910 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
18920 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
18930 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
18940 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
18950 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
18960 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
18970 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
18980 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
18990 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
189a0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
189b0 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
189c0 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e  .          winUn
189d0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
189e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
189f0 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  inMapfile(pFile,
18a00 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
18a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
18a20 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18a30 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
18a40 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
18a50 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
18a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18a70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18a80 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46   }.  OSTRACE(("F
18a90 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18aa0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
18ab0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18ac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18ad0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
18ae0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
18af0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
18b00 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
18b10 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
18b20 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
18b30 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
18b40 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
18b50 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
18b60 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
18b70 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
18b80 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
18b90 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
18ba0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
18bb0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
18bc0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
18bd0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
18be0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
18bf0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
18c00 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
18c10 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
18c20 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
18c30 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
18c40 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
18c50 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
18c60 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
18c70 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
18c80 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
18c90 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
18ca0 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
18cb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
18cc0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
18cd0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
18ce0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
18cf0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
18d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18d10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
18d20 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
18d30 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
18d40 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
18d50 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
18d60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
18d70 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
18d80 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
18d90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
18da0 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
18db0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
18dc0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
18dd0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f  .}../* .** Windo
18de0 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
18df0 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
18e00 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
18e10 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
18e20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
18e30 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
18e40 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
18e50 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
18e60 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
18e70 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
18e80 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
18e90 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45  .*/.static SYSTE
18ea0 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
18eb0 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
18ec0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
18ed0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
18ee0 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
18ef0 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
18f00 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
18f10 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
18f20 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
18f30 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
18f40 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
18f50 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66  ed by .** this f
18f60 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
18f70 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  h may be shared 
18f80 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
18f90 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
18fa0 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  ion winShmMutexH
18fb0 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
18fc0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
18fd0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
18fe0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
18ff0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
19000 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
19010 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
19020 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
19030 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
19040 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
19050 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
19060 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
19070 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
19080 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
19090 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
190a0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
190b0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
190c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
190d0 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
190e0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
190f0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
19100 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
19110 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
19120 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
19130 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
19140 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
19150 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
19160 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
19170 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19180 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
19190 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
191a0 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
191b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
191c0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
191d0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
191e0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
191f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
19200 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
19210 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
19220 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
19230 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
19240 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
19250 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
19260 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
19270 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
19280 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
19290 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
192a0 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
192b0 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
192c0 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
192d0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
192e0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
192f0 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
19300 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
19310 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
19320 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
19330 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
19340 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
19350 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
19360 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
19370 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
19380 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
19390 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
193a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
193b0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
193c0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
193d0 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
193e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
193f0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
19400 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
19410 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
19420 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
19430 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
19440 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
19450 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
19460 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
19470 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
19480 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
19490 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
194a0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
194b0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
194c0 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
194d0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
194e0 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
194f0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
19500 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
19510 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
19520 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
19530 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
19540 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
19550 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19560 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
19570 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
19580 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
19590 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
195a0 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
195b0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195d0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
195e0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
195f0 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19610 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
19620 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
19630 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
19640 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19660 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
19670 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
19680 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
19690 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
196a0 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
196b0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
196c0 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
196d0 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
196e0 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
196f0 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19710 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
19720 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
19730 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
19740 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
19750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19760 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
19770 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
19780 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
19790 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
197a0 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
197b0 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
197c0 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
197d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
197e0 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
197f0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
19800 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
19810 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
19820 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
19830 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
19840 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
19850 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
19860 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
19870 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
19880 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
19890 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
198a0 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
198b0 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
198c0 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
198d0 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
198e0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
198f0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
19900 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
19910 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
19920 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
19930 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
19940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
19950 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
19960 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
19970 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
19980 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
19990 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
199a0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
199b0 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
199c0 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
199d0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
199e0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
199f0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
19a00 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
19a10 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
19a20 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
19a30 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
19a40 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
19a50 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
19a60 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
19a70 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
19a80 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
19a90 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
19aa0 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
19ab0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
19ac0 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
19ad0 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
19ae0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
19af0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
19b00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19b10 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
19b20 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
19b30 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
19b40 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
19b50 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
19b60 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
19b70 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b90 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
19ba0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
19bb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
19bc0 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
19bf0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
19c00 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
19c10 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
19c20 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
19c30 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
19c40 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
19c50 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
19c60 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
19c70 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
19c80 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
19c90 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
19ca0 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
19cb0 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
19cc0 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
19cd0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
19ce0 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
19cf0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
19d00 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
19d10 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
19d20 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
19d30 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
19d40 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
19d50 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
19d60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
19d70 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
19d80 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
19d90 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
19da0 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
19db0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
19dc0 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
19dd0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
19de0 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
19df0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
19e00 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
19e10 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
19e20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
19e30 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
19e40 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
19e50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
19e60 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
19e70 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19e80 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
19e90 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
19ea0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
19eb0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
19ec0 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
19ed0 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
19ee0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
19ef0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
19f00 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
19f10 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
19f20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19f30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
19f40 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ile->mutex) || p
19f50 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  File->nRef==0 );
19f60 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
19f70 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
19f80 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d  lock=%d, offset=
19f90 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a  %d, size=%d\n",.
19fa0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19fb0 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54  ->hFile.h, lockT
19fc0 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65  ype, ofst, nByte
19fd0 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  ));..  /* Releas
19fe0 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
19ff0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
1a000 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
1a010 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
1a020 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c  .    rc = winUnl
1a030 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
1a040 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30  hFile.h, ofst, 0
1a050 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1a060 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
1a070 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
1a080 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1a090 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c  /.    DWORD dwFl
1a0a0 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46  ags = LOCKFILE_F
1a0b0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b  AIL_IMMEDIATELY;
1a0c0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1a0d0 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  e == _SHM_WRLCK 
1a0e0 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43  ) dwFlags |= LOC
1a0f0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
1a100 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77  LOCK;.    rc = w
1a110 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
1a120 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c  e->hFile.h, dwFl
1a130 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  ags, ofst, 0, nB
1a140 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a  yte, 0);.  }.  .
1a150 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a    if( rc!= 0 ){.
1a160 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a170 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1a180 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1a190 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72  o =  osGetLastEr
1a1a0 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
1a1b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1a1c0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
1a1d0 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
1a1e0 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25  func=%s, errno=%
1a1f0 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  lu, rc=%s\n",.  
1a200 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1a210 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79  hFile.h, (lockTy
1a220 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b  pe == _SHM_UNLCK
1a230 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69  ) ? "winUnlockFi
1a240 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20  le" :.          
1a250 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20   "winLockFile", 
1a260 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a270 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1a280 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  (rc)));..  retur
1a290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1a2a0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
1a2b0 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
1a2c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1a2d0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
1a2e0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
1a2f0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
1a300 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
1a310 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
1a320 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
1a330 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
1a340 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
1a350 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
1a360 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
1a370 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
1a380 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
1a390 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
1a3a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1a3b0 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
1a3c0 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
1a3d0 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
1a3e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
1a3f0 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
1a400 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
1a410 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
1a420 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
1a430 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
1a440 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
1a450 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65  mNode *p;.  asse
1a460 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
1a470 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41  eld() );.  OSTRA
1a480 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70  CE(("SHM-PURGE p
1a490 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c  id=%lu, deleteFl
1a4a0 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ag=%d\n",.      
1a4b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1a4c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65  tProcessId(), de
1a4d0 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70  leteFlag));.  pp
1a4e0 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69   = &winShmNodeLi
1a4f0 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20  st;.  while( (p 
1a500 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20  = *pp)!=0 ){.   
1a510 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
1a520 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1a530 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74        if( p->mut
1a540 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75  ex ){ sqlite3_mu
1a550 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
1a560 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28  x); }.      for(
1a570 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
1a580 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1a590 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e   BOOL bRc = osUn
1a5a0 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d  mapViewOfFile(p-
1a5b0 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70  >aRegion[i].pMap
1a5c0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1a5d0 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55  CE(("SHM-PURGE-U
1a5e0 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  NMAP pid=%lu, re
1a5f0 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1a600 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a610 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1a620 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1a630 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1a640 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1a650 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1a660 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1a670 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
1a680 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
1a690 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
1a6a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a6b0 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20  SHM-PURGE-CLOSE 
1a6c0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
1a6d0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1a6f0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1a700 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
1a710 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1a720 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53  ));.        UNUS
1a730 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55  ED_VARIABLE_VALU
1a740 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a  E(bRc);.      }.
1a750 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69        if( p->hFi
1a760 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d  le.h!=NULL && p-
1a770 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49  >hFile.h!=INVALI
1a780 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
1a790 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
1a7a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a7b0 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43  1);.        winC
1a7c0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
1a7d0 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b  le *)&p->hFile);
1a7e0 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
1a7f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1a800 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a810 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
1a820 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1a830 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a840 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (1);.        sql
1a850 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
1a860 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1a870 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c   winDelete(pVfs,
1a880 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   p->zFilename, 0
1a890 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a8a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
1a8b0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  c();.        Sim
1a8c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a8d0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1a8e0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e       *pp = p->pN
1a8f0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1a900 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69  e3_free(p->aRegi
1a910 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
1a920 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1a930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20  }else{.      pp 
1a940 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = &p->pNext;.   
1a950 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a960 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d  Open the shared-
1a970 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
1a980 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ciated with data
1a990 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
1a9a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
1a9b0 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
1a9c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
1a9d0 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
1a9e0 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
1a9f0 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
1aa00 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
1aa10 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
1aa20 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
1aa30 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
1aa40 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
1aa50 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
1aa60 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
1aa70 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  der cleared..*/.
1aa80 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
1aa90 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77  enSharedMemory(w
1aaa0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  inFile *pDbFd){.
1aab0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20    struct winShm 
1aac0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1aad0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1aae0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
1aaf0 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
1ab00 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1ab10 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54  Node = 0;   /* T
1ab20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1ab30 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1ab40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab60 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1ab70 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69  e */.  struct wi
1ab80 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20  nShmNode *pNew; 
1ab90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1aba0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e  ly allocated win
1abb0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ShmNode */.  int
1abc0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65  /* Size of zName
1abf0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1ac00 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
1ac10 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  Shm==0 );    /* 
1ac20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  Not previously o
1ac30 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41  pened */..  /* A
1ac40 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1ac50 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  r the new sqlite
1ac60 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41  3_shm object.  A
1ac70 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c  lso speculativel
1ac80 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20  y.  ** allocate 
1ac90 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1aca0 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66  winShmNode and f
1acb0 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ilename..  */.  
1acc0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
1acd0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1ace0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
1acf0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1ad00 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e  IOERR_NOMEM;.  n
1ad10 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1ad20 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
1ad30 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
1ad40 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1ad50 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
1ad60 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
1ad70 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1ad80 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1ad90 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
1ada0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1adb0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  R_NOMEM;.  }.  p
1adc0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
1add0 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
1ade0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1adf0 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70  intf(nName+15, p
1ae00 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  New->zFilename, 
1ae10 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1ae20 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74  >zPath);.  sqlit
1ae30 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
1ae40 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77  bFd->zPath, pNew
1ae50 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a  ->zFilename); ..
1ae60 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65    /* Look to see
1ae70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1ae80 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e  existing winShmN
1ae90 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ode that can be 
1aea0 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f  used..  ** If no
1aeb0 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d   matching winShm
1aec0 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65  Node currently e
1aed0 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20  xists, create a 
1aee0 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
1aef0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1af00 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f  ();.  for(pShmNo
1af10 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  de = winShmNodeL
1af20 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70  ist; pShmNode; p
1af30 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65  ShmNode=pShmNode
1af40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
1af50 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d   TBD need to com
1af60 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72  e up with better
1af70 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65   match here.  Pe
1af80 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65  rhaps.    ** use
1af90 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49   FILE_ID_BOTH_DI
1afa0 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65  R_INFO Structure
1afb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1afc0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1afd0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1afe0 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ame, pNew->zFile
1aff0 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  name)==0 ) break
1b000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
1b010 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Node ){.    sqli
1b020 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
1b030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68    }else{.    pSh
1b040 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20  mNode = pNew;.  
1b050 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
1b060 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68  ((winFile*)(&pSh
1b070 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e  mNode->hFile))->
1b080 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
1b090 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53  LE_VALUE;.    pS
1b0a0 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20  hmNode->pNext = 
1b0b0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
1b0c0 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69      winShmNodeLi
1b0d0 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a  st = pShmNode;..
1b0e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1b0f0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1b100 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1b110 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1b120 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1b130 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1b140 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1b150 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1b160 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1b170 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
1b180 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
1b190 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20  d->pVfs,.       
1b1a0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1b1b0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  de->zFilename,  
1b1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1b1d0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
1b1e0 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20  UTF-8) */.      
1b1f0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1b200 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e  te3_file*)&pShmN
1b210 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20  ode->hFile,  /* 
1b220 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  File handle here
1b230 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b240 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b250 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _WAL | SQLITE_OP
1b260 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1b270 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1b280 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
1b290 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
1b2a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
1b2b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1b2c0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1b2d0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1b2e0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1b2f0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1b300 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1b310 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1b320 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1b330 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1b340 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
1b350 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
1b360 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1b370 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
1b380 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
1b390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3a0 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
1b3b0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1b3c0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
1b3d0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
1b3e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b3f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1b400 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1b410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
1b420 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
1b430 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44  "winOpenShm", pD
1b460 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1b470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b490 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   ){.      winShm
1b4a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1b4b0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1b4c0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1b4d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1b4e0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1b4f0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
1b500 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1b510 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1b520 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d  f( rc ) goto shm
1b530 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1b540 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1b550 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1b560 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
1b570 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1b580 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1b590 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
1b5a0 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
1b5b0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
1b5c0 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
1b5d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1b5e0 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
1b5f0 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c  m = p;.  winShmL
1b600 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1b610 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
1b620 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
1b630 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
1b640 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
1b650 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
1b660 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53  over of the winS
1b670 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  hmEnterMutex() m
1b680 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
1b690 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
1b6a0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77  ** new (struct w
1b6b0 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  inShm) object to
1b6c0 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
1b6d0 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
1b6e0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
1b6f0 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
1b700 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
1b710 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
1b720 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
1b730 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
1b740 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
1b750 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
1b760 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
1b770 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
1b780 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1b790 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b7a0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1b7b0 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1b7c0 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1b7d0 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1b7e0 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1b7f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b800 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1b810 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1b820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1b830 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1b840 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1b850 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
1b860 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1b870 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1b880 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1b890 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
1b8a0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
1b8b0 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
1b8c0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1b8d0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1b8e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1b8f0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
1b900 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
1b910 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1b920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b930 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1b940 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
1b950 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
1b960 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
1b970 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ng .** storage i
1b980 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
1b990 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
1b9a0 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28  int winShmUnmap(
1b9b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1b9c0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1b9d0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1b9e0 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1b9f0 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
1ba00 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1ba10 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20  /* Delete after 
1ba20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20  closing if true 
1ba30 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1ba40 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a  *pDbFd;       /*
1ba50 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1ba60 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1ba70 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20  */.  winShm *p; 
1ba80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ba90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1baa0 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77  be closed */.  w
1bab0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1bac0 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1bad0 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1bae0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
1baf0 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  inShm **pp;     
1bb00 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1bb10 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
1bb20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1bb30 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
1bb40 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
1bb50 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
1bb60 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1bb70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
1bb80 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1bb90 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ode;..  /* Remov
1bba0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
1bbb0 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
1bbc0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
1bbd0 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
1bbe0 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
1bbf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1bc00 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1bc10 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
1bc20 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1bc30 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
1bc40 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
1bc50 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1bc60 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
1bc70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
1bc80 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1bc90 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
1bca0 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
1bcb0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1bcc0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
1bcd0 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
1bce0 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
1bcf0 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
1bd00 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1bd10 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
1bd20 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
1bd30 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1bd40 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
1bd50 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
1bd60 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
1bd70 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
1bd80 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
1bd90 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72  ){.    winShmPur
1bda0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1bdb0 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d  deleteFlag);.  }
1bdc0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1bdd0 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1bde0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1bdf0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1be00 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
1be10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1be20 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
1be30 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b  c int winShmLock
1be40 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1be50 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1be60 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
1be70 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
1be80 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1be90 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1bea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1beb0 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
1bec0 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
1bed0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bef0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
1bf00 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1bf10 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1bf20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1bf30 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
1bf40 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
1bf50 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ck */.){.  winFi
1bf60 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1bf70 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20  File*)fd;       
1bf80 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1bf90 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1bfa0 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1bfb0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1bfc0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bfd0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
1bfe0 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
1bff0 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  d */.  winShm *p
1c000 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c020 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1c030 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
1c040 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1c050 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1c060 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1c070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c090 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1c0a0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1c0d0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
1c0e0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1c0f0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
1c100 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
1c110 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1c120 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
1c130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
1c140 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1c150 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1c160 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1c170 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1c180 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
1c190 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1c1a0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
1c1b0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1c1c0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
1c1d0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1c1e0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1c1f0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1c200 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1c210 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
1c220 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
1c230 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1c240 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
1c250 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75   );..  mask = (u
1c260 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e  16)((1U<<(ofst+n
1c270 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29  )) - (1U<<ofst))
1c280 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
1c290 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
1c2a0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
1c2b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1c2c0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1c2d0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1c2e0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
1c2f0 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
1c300 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
1c310 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
1c320 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
1c330 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
1c340 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
1c350 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
1c360 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1c370 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1c380 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1c390 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
1c3a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c3b0 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
1c3c0 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
1c3d0 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
1c3e0 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
1c3f0 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
1c400 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1c410 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
1c420 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1c430 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1c440 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
1c450 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1c460 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1c470 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1c480 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74  _SHM_UNLCK, ofst
1c490 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1c4a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c4b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c4c0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
1c4d0 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
1c4e0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1c4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c500 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
1c510 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1c520 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1c530 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1c540 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
1c550 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1c560 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
1c570 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
1c580 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
1c590 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
1c5a0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
1c5b0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
1c5c0 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
1c5d0 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
1c5e0 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
1c5f0 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
1c600 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
1c610 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
1c620 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
1c630 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
1c640 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
1c650 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
1c660 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
1c670 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1c680 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1c690 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1c6a0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1c6b0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1c6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1c6d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1c6e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c6f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
1c700 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
1c710 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1c720 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
1c730 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
1c740 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
1c750 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1c760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1c780 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
1c790 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1c7a0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1c7b0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1c7c0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66  , _SHM_RDLCK, of
1c7d0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1c7e0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
1c7f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c800 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c810 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c820 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
1c830 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
1c840 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1c860 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1c870 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1c880 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
1c890 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
1c8a0 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
1c8b0 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
1c8c0 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
1c8d0 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
1c8e0 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
1c8f0 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
1c900 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1c910 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1c920 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1c930 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c940 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1c950 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
1c960 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
1c970 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1c980 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c990 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1c9a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c9b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
1c9c0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
1c9d0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1c9e0 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
1c9f0 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
1ca00 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
1ca10 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
1ca20 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
1ca30 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
1ca40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ca50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1ca60 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1ca70 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1ca80 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_WRLCK, ofst+WI
1ca90 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1caa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cac0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
1cad0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1cae0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1caf0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
1cb00 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
1cb10 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1cb20 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1cb30 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1cb40 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1cb50 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d  OCK pid=%lu, id=
1cb60 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25  %d, sharedMask=%
1cb70 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30  03x, exclMask=%0
1cb80 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  3x, rc=%s\n",.  
1cb90 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1cba0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1cbb0 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72  , p->id, p->shar
1cbc0 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
1cbd0 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
1cbe0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1cbf0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
1cc00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
1cc10 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
1cc20 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
1cc30 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
1cc40 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
1cc50 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
1cc60 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
1cc70 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
1cc80 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
1cc90 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
1cca0 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
1ccb0 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
1ccc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ccd0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a   winShmBarrier(.
1cce0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1ccf0 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  fd          /* D
1cd00 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1cd10 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1cd20 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
1cd30 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1cd40 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69    /* MemoryBarri
1cd50 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f  er(); // does no
1cd60 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74  t work -- do not
1cd70 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f   know why not */
1cd80 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1cd90 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  tex();.  winShmL
1cda0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
1cdb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1cdc0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1cdd0 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
1cde0 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
1cdf0 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
1ce00 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
1ce10 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1ce20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1ce30 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
1ce40 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
1ce50 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
1ce60 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
1ce70 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
1ce80 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
1ce90 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
1cea0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
1ceb0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1cec0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1ced0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1cee0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1cef0 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
1cf00 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69  se, if the isWri
1cf10 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  te parameter is 
1cf20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
1cf30 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1cf40 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
1cf50 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1cf60 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
1cf70 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
1cf80 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
1cf90 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1cfa0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
1cfb0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1cfc0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1cfd0 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69  ed. If .** isWri
1cfe0 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  te is non-zero a
1cff0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1d000 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1d010 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
1d020 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
1d030 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
1d040 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
1d050 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1d060 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1d070 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
1d080 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1d090 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
1d0a0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
1d0b0 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
1d0c0 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
1d0d0 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
1d0e0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
1d0f0 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
1d100 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1d110 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
1d120 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1d130 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
1d140 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
1d150 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
1d160 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1d170 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
1d180 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1d190 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
1d1a0 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
1d1b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1d1c0 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d1e0 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
1d1f0 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
1d200 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1d210 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1d220 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
1d230 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20   int isWrite,   
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d250 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
1d260 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
1d270 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
1d280 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
1d290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d2a0 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
1d2b0 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1d2c0 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c  *pDbFd = (winFil
1d2d0 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20  e*)fd;.  winShm 
1d2e0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1d2f0 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1d300 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1d310 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d320 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
1d330 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61   rc = winOpenSha
1d340 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
1d350 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1d360 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1d370 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62   rc;.    p = pDb
1d380 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20  Fd->pShm;.  }.  
1d390 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1d3a0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74  hmNode;..  sqlit
1d3b0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1d3c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d3d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
1d3e0 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
1d3f0 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
1d400 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
1d410 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1d420 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1d430 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75  gion ){.    stru
1d440 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70  ct ShmRegion *ap
1d450 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1d460 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20  * New aRegion[] 
1d470 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
1d480 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
1d490 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  n+1)*szRegion;  
1d4a0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69  /* Minimum requi
1d4b0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1d4d0 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  64 sz;          
1d4e0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1d4f0 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69  nt size of wal-i
1d500 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  ndex file */..  
1d510 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
1d520 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
1d530 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  ..    /* The req
1d540 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
1d550 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
1d560 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1d570 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
1d580 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
1d590 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
1d5a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
1d5b0 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
1d5c0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  ex file is.    *
1d5d0 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
1d5e0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
1d5f0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
1d600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1d610 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71   winFileSize((sq
1d620 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1d630 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26  hmNode->hFile, &
1d640 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sz);.    if( rc!
1d650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d660 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1d670 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d680 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
1d690 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22      "winShmMap1"
1d6c0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1d6d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1d6e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
1d6f0 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
1d700 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1d710 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1d720 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
1d730 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
1d740 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
1d750 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
1d760 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
1d770 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
1d780 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1d790 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
1d7a0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
1d7b0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
1d7c0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1d7d0 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
1d7e0 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
1d7f0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
1d800 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1d810 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1d820 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
1d830 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
1d840 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
1d850 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1d860 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1d870 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
1d880 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
1d890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d8a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1d8b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d8c0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1d8d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1d8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d8f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1d900 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap2", pDbFd->z
1d910 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67  Path);.        g
1d920 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1d930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d940 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1d950 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1d960 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1d970 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1d980 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1d990 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74   apNew = (struct
1d9a0 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c   ShmRegion *)sql
1d9b0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
1d9c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d9d0 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
1d9e0 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
1d9f0 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
1da00 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
1da10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1da20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1da30 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1da40 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1da50 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1da60 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20  n = apNew;..    
1da70 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
1da80 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
1da90 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c  n ){.      HANDL
1daa0 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20  E hMap = NULL;  
1dab0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d         /* file-m
1dac0 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f  apping handle */
1dad0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  .      void *pMa
1dae0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
1daf0 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d     /* Mapped mem
1db00 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ory region */.  
1db10 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f     .#if SQLITE_O
1db20 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1db30 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1db40 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1db50 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1db60 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1db70 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1db80 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1db90 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1dba0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1dbb0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1dbc0 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1dbd0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1dbe0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1dbf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
1dc00 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1dc10 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1dc20 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1dc30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1dc40 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
1dc50 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1dc60 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1dc70 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  A(pShmNode->hFil
1dc80 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
1dc90 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1dca0 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1dcb0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1dcc0 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
1dcd0 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45  CE(("SHM-MAP-CRE
1dce0 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  ATE pid=%lu, reg
1dcf0 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c  ion=%d, size=%d,
1dd00 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1dd10 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1dd20 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1dd30 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1dd40 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20  gion, nByte,.   
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70              hMap
1dd60 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1dd70 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  d"));.      if( 
1dd80 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  hMap ){.        
1dd90 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53  int iOffset = pS
1dda0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a  hmNode->nRegion*
1ddb0 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20  szRegion;.      
1ddc0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
1ddd0 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
1dde0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
1ddf0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
1de00 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  y;.#if SQLITE_OS
1de10 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70  _WINRT.        p
1de20 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  Map = osMapViewO
1de30 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61  fFileFromApp(hMa
1de40 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1de50 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1de60 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  D,.            i
1de70 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
1de80 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
1de90 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
1dea0 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
1deb0 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
1dec0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68  sMapViewOfFile(h
1ded0 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1dee0 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1def0 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1df00 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f   0, iOffset - iO
1df10 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
1df20 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
1df30 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
1df40 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53  endif.        OS
1df50 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
1df60 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  MAP pid=%lu, reg
1df70 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ion=%d, offset=%
1df80 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25  d, size=%d, rc=%
1df90 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1dfa0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1dfb0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1dfc0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1dfd0 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20  n, iOffset,.    
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52               szR
1dff0 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f  egion, pMap ? "o
1e000 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1e010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e020 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20  f( !pMap ){.    
1e030 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61      pShmNode->la
1e040 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1e050 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1e060 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1e070 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e080 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f  R_SHMMAP, pShmNo
1e090 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  de->lastErrno,. 
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1e0c0 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap3", pDbFd->zPa
1e0d0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  th);.        if(
1e0e0 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48   hMap ) osCloseH
1e0f0 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
1e100 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1e110 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
1e120 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e130 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
1e140 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
1e150 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
1e160 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1e170 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e180 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
1e190 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e1a0 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
1e1b0 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
1e1c0 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
1e1d0 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
1e1e0 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
1e1f0 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
1e200 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
1e210 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
1e220 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
1e230 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
1e240 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
1e250 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
1e260 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
1e270 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
1e280 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
1e290 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
1e2a0 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
1e2b0 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
1e2c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1e2d0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1e2e0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1e2f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1e300 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
1e310 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
1e320 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
1e330 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1e340 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
1e350 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
1e360 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
1e370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e380 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
1e390 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20  * Cleans up the 
1e3a0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66  mapped region of
1e3b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1e3c0 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ile, if any..*/.
1e3d0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1e3e0 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69  MAP_SIZE>0.stati
1e3f0 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
1e400 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
1e410 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  e){.  assert( pF
1e420 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52  ile!=0 );.  OSTR
1e430 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45  ACE(("UNMAP-FILE
1e440 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1e450 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61  %p, hMap=%p, pMa
1e460 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
1e470 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69           "mmapSi
1e480 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  ze=%lld, mmapSiz
1e490 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d  eActual=%lld, mm
1e4a0 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e  apSizeMax=%lld\n
1e4b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1e4c0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1e4d0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
1e4e0 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65  ile->hMap, pFile
1e4f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20  ->pMapRegion,.  
1e500 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1e510 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d  mmapSize, pFile-
1e520 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c  >mmapSizeActual,
1e530 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1e540 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69  Max));.  if( pFi
1e550 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  le->pMapRegion )
1e560 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d  {.    if( !osUnm
1e570 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
1e580 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20  le->pMapRegion) 
1e590 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1e5a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e5b0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e5c0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e      OSTRACE(("UN
1e5d0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e5e0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
1e5f0 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
1e600 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
1e610 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1e620 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  P\n", osGetCurre
1e630 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e640 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
1e650 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70       pFile->pMap
1e660 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  Region));.      
1e670 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
1e680 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e690 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
1e6a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22   "winUnmapfile1"
1e6d0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e6e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1e6f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
1e700 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
1e710 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  pSize = 0;.    p
1e720 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
1e730 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tual = 0;.  }.  
1e740 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21  if( pFile->hMap!
1e750 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
1e760 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28   !osCloseHandle(
1e770 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a  pFile->hMap) ){.
1e780 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1e790 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1e7a0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1e7b0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1e7c0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1e7d0 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
1e7e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
1e7f0 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20  R_MMAP\n",.     
1e800 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1e810 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1e820 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
1e830 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72  >hMap));.      r
1e840 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
1e850 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1e860 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  MAP, pFile->last
1e870 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c  "winUnmapfile2",
1e8a0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1e8b0 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1e8c0 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1e8d0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  }.  OSTRACE(("UN
1e8e0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e8f0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1e900 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1e910 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e920 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e930 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75   pFile));.  retu
1e940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e950 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61  ./*.** Memory ma
1e960 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66  p or remap the f
1e970 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69  ile opened by fi
1e980 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46  le-descriptor pF
1e990 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a  d (if the file.*
1e9a0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70  * is already map
1e9b0 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e  ped, the existin
1e9c0 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70  g mapping is rep
1e9d0 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77  laced by the new
1e9e0 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68  ). Or, if .** th
1e9f0 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
1ea00 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72  ts a mapping for
1ea10 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
1ea20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
1ea30 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
1ea40 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
1ea50 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
1ea60 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1ea70 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
1ea80 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
1ea90 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
1eaa0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
1eab0 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20  quested size of 
1eac0 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20  .** the mapping 
1ead0 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72  to create. Other
1eae0 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69  wise, if nByte i
1eaf0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
1eb00 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72  , then the .** r
1eb10 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
1eb20 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1eb30 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
1eb40 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
1eb50 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
1eb60 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
1eb70 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
1eb80 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
1eb90 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a  ue configured .*
1eba0 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
1ebb0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
1ebc0 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
1ebd0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
1ebe0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ebf0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
1ec00 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
1ec10 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
1ec20 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
1ec30 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
1ec40 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1ec50 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
1ec60 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
1ec70 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1ec80 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
1ec90 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64  ile(winFile *pFd
1eca0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1ecb0 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65  nByte){.  sqlite
1ecc0 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e  3_int64 nMap = n
1ecd0 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
1ece0 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
1ecf0 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
1ed00 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  hOut==0 );.  OST
1ed10 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1ed20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1ed30 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c  p, size=%lld\n",
1ed40 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1ed50 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ed60 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29  d(), pFd, nByte)
1ed70 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e  );..  if( pFd->n
1ed80 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
1ed90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1eda0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
1edb0 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
1edc0 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
1edd0 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b  le*)pFd, &nMap);
1ede0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1edf0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1ee00 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1ee10 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1ee20 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1ee30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ee40 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1ee50 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1ee60 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1ee70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1ee80 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  TAT;.    }.  }. 
1ee90 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
1eea0 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
1eeb0 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
1eec0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20  apSizeMax;.  }. 
1eed0 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74   nMap &= ~(sqlit
1eee0 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73  e3_int64)(winSys
1eef0 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20  Info.dwPageSize 
1ef00 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d  - 1);. .  if( nM
1ef10 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d  ap==0 && pFd->mm
1ef20 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1ef30 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1ef40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61  );.  }.  if( nMa
1ef50 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  p!=pFd->mmapSize
1ef60 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
1ef70 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52  ew = 0;.    DWOR
1ef80 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45  D protect = PAGE
1ef90 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44  _READONLY;.    D
1efa0 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c  WORD flags = FIL
1efb0 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20  E_MAP_READ;..   
1efc0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1efd0 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64  d);.    if( (pFd
1efe0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
1eff0 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  NFILE_RDONLY)==0
1f000 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63   ){.      protec
1f010 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49  t = PAGE_READWRI
1f020 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  TE;.      flags 
1f030 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  |= FILE_MAP_WRIT
1f040 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  E;.    }.#if SQL
1f050 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1f060 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1f070 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1f080 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20  FromApp(pFd->h, 
1f090 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e  NULL, protect, n
1f0a0 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69  Map, NULL);.#eli
1f0b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f0c0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1f0d0 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
1f0e0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1f0f0 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55  pingW(pFd->h, NU
1f100 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1f130 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20  ORD)((nMap>>32) 
1f140 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f170 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78  DWORD)(nMap & 0x
1f180 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29  ffffffff), NULL)
1f190 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1f1a0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1f1b0 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e  _ANSI).    pFd->
1f1c0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1f1d0 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d  ileMappingA(pFd-
1f1e0 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1f1f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1f220 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1f230 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1f260 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1f270 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
1f280 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70     if( pFd->hMap
1f290 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
1f2a0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
1f2b0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1f2c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1f2d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1f2e0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
1f2f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31      "winMapfile1
1f320 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
1f330 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
1f340 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
1f350 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
1f360 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
1f370 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
1f380 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1f390 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d  FILE-CREATE pid=
1f3a0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1f3b0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1f3c0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f3d0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f3e0 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1f3f0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1f400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f410 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OK;.    }.    as
1f420 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69  sert( (nMap % wi
1f430 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
1f440 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ize)==0 );.    a
1f450 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49  ssert( sizeof(SI
1f460 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71  ZE_T)==sizeof(sq
1f470 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20  lite3_int64) || 
1f480 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66  nMap<=0xffffffff
1f490 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
1f4a0 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77  S_WINRT.    pNew
1f4b0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1f4c0 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  leFromApp(pFd->h
1f4d0 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28  Map, flags, 0, (
1f4e0 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
1f4f0 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  lse.    pNew = o
1f500 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
1f510 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
1f520 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e   0, 0, (SIZE_T)n
1f530 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Map);.#endif.   
1f540 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
1f550 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  ){.      osClose
1f560 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70  Handle(pFd->hMap
1f570 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d  );.      pFd->hM
1f580 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ap = NULL;.     
1f590 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
1f5a0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1f5b0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1f5c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1f5d0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1f5e0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
1f610 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  2", pFd->zPath);
1f620 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
1f630 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
1f640 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
1f650 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
1f660 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
1f670 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1f680 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c  -FILE-MAP pid=%l
1f690 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1f6a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1f6b0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f6c0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f6d0 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
1f6e0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1f6f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d  ;.    }.    pFd-
1f710 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e  >pMapRegion = pN
1f720 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ew;.    pFd->mma
1f730 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20  pSize = nMap;.  
1f740 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41    pFd->mmapSizeA
1f750 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20  ctual = nMap;.  
1f760 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d  }..  OSTRACE(("M
1f770 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1f780 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1f790 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
1f7a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f7b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f7c0 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  pFd));.  return 
1f7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1f7e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
1f7f0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
1f800 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69  ../*.** If possi
1f810 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ble, return a po
1f820 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
1f830 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74  ng of file fd st
1f840 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74  arting at offset
1f850 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61  .** iOff. The ma
1f860 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61  pping must be va
1f870 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  lid for at least
1f880 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a   nAmt bytes..**.
1f890 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69  ** If such a poi
1f8a0 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61  nter can be obta
1f8b0 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69  ined, store it i
1f8c0 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e  n *pp and return
1f8d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
1f8e0 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  r, if one cannot
1f8f0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1f900 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f  curs, set *pp to
1f910 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51   0 and return SQ
1f920 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61  LITE_OK..** Fina
1f930 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1f940 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
1f950 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1f960 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
1f970 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
1f980 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64  *pp is undefined
1f990 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1f9a0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
1f9b0 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72  ction does retur
1f9c0 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  n a pointer, the
1f9d0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65   caller must eve
1f9e0 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65  ntually .** rele
1f9f0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
1fa00 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e  e by calling win
1fa10 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74  Unfetch()..*/.st
1fa20 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63  atic int winFetc
1fa30 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1fa40 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
1fa50 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
1fa60 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
1fa70 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1fa80 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
1fa90 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
1faa0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1fab0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1fac0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20  */.#endif.  *pp 
1fad0 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
1fae0 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
1faf0 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
1fb00 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25  t=%lld, amount=%
1fb10 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  d, pp=%p\n",.   
1fb20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1fb30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1fb40 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c   fd, iOff, nAmt,
1fb50 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49   pp));..#if SQLI
1fb60 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1fb70 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  >0.  if( pFd->mm
1fb80 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20  apSizeMax>0 ){. 
1fb90 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70     if( pFd->pMap
1fba0 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Region==0 ){.   
1fbb0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d     int rc = winM
1fbc0 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
1fbd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1fbe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fbf0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45      OSTRACE(("FE
1fc00 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1fc10 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1fc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc30 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1fc40 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1fc50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1fc60 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
1fc70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fc80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1fc90 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
1fca0 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
1fcb0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
1fcc0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
1fcd0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
1fce0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
1fcf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1fd00 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  f..  OSTRACE(("F
1fd10 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1fd20 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a  ile=%p, pp=%p, *
1fd30 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  pp=%p, rc=SQLITE
1fd40 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1fd50 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1fd60 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
1fd70 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74  pp, *pp));.  ret
1fd80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fd90 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
1fda0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
1fdb0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
1fdc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1fdd0 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66  leases a .** ref
1fde0 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
1fdf0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
1fe00 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29  ll to winFetch()
1fe10 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  . The second.** 
1fe20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1fe30 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1fe40 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
1fe50 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  e as the corresp
1fe60 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65  onding.** argume
1fe70 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73  nt that was pass
1fe80 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74  ed to the winFet
1fe90 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
1fea0 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
1feb0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
1fec0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1fed0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1fee0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
1fef0 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
1ff00 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
1ff10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
1ff20 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
1ff30 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
1ff40 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
1ff50 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
1ff60 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
1ff70 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
1ff80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
1ff90 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
1ffa0 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
1ffb0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1ffc0 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
1ffd0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1ffe0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1fff0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
20000 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70  le */..  /* If p
20010 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
20020 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
20030 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
20040 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
20050 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
20060 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
20070 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
20080 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
20090 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
200a0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
200b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
200c0 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
200d0 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
200e0 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
200f0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
20100 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
20110 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
20120 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
20130 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
20140 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
20150 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
20160 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
20170 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
20180 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
20190 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  d, p=%p\n",.    
201a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
201b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
201c0 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a  pFd, iOff, p));.
201d0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
201e0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
201f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
20200 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e  * FIXME:  If Win
20210 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79  dows truly alway
20220 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63  s prevents trunc
20230 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e  ating or deletin
20240 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  g a.    ** file 
20250 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20  while a mapping 
20260 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68  is held, then th
20270 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55  e following winU
20280 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a  nmapfile() call.
20290 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65      ** is unnece
202a0 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65  ssary can can be
202b0 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e   omitted - poten
202c0 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67  tially improving
202d0 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61  .    ** performa
202e0 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e  nce.  */.    win
202f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
20300 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
20310 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30  Fd->nFetchOut>=0
20320 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
20330 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
20340 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20350 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
20360 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20370 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20380 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20  ssId(), fd));.  
20390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
203a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  ;.}../*.** Here 
203b0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
203c0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
203d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
203e0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
203f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
20400 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
20410 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
20420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20430 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
20440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20480 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
20490 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
204a0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
204b0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
204c0 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
204d0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
204e0 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
204f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
20500 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
20510 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20  hod = {.  3,    
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
20540 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
20550 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
20560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
20570 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
20580 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
20590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
205a0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
205b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
205c0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
205d0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
205e0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
205f0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
20600 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
20610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20620 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
20630 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
20640 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
20650 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
20660 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
20670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20680 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
20690 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
206a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
206b0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
206c0 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
206d0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
206e0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
206f0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
20700 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
20710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20720 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
20730 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
20740 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
20750 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
20760 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
20770 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20780 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
20790 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
207a0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
207b0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
207c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
207d0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
207e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
207f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
20800 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
20810 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
20820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20830 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
20840 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  inShmUnmap,     
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20860 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
20870 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20   winFetch,      
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20   /* xFetch */.  
208a0 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20  winUnfetch      
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d  /* xUnfetch */.}
208d0 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
208e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20920 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
20940 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
20950 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
20960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
20970 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
20980 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
20990 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
209a0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
209b0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
209c0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20  object..*/..#if 
209d0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
209e0 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  __)./*.** Conver
209f0 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
20a00 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
20a10 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
20a20 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
20a30 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
20a40 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
20a50 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
20a60 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
20a70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
20a80 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
20a90 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
20aa0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
20ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
20ac0 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
20ad0 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
20ae0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
20af0 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
20b00 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
20b10 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
20b20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
20b30 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
20b40 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
20b50 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
20b60 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
20b70 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
20b80 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
20b90 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
20ba0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
20bb0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
20bc0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
20bd0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
20be0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
20bf0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
20c00 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
20c10 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
20c20 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
20c30 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
20c40 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
20c50 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
20c60 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
20c70 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
20c80 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
20c90 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
20ca0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
20cb0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
20cc0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
20cd0 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
20ce0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
20cf0 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
20d00 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
20d10 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
20d20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
20d30 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
20d40 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
20d50 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
20d60 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
20d70 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
20d80 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
20d90 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
20da0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
20db0 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
20dc0 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
20dd0 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
20de0 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
20df0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
20e00 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
20e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20e20 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
20e30 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
20e40 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
20e50 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
20e60 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
20e70 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
20e80 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20  haracter or one 
20e90 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
20ea0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e  .** added to it.
20eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20ec0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
20ed0 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  p(int nBuf, char
20ee0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
20ef0 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
20f00 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
20f10 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
20f20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20   if( nLen>0 ){. 
20f30 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
20f40 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31  rSep(zBuf[nLen-1
20f50 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
20f60 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
20f70 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e  lse if( nLen+1<n
20f80 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Buf ){.        z
20f90 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47  Buf[nLen] = winG
20fa0 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20  etDirSep();.    
20fb0 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d      zBuf[nLen+1]
20fc0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
20fd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
20fe0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
20ff0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21000 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
21010 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
21020 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
21030 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
21040 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
21050 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
21060 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
21070 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
21080 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
21090 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
210a0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
210b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
210c0 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
210d0 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
210e0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
210f0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
21100 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
21110 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
21120 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
21130 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
21140 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
21150 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Pre = sqlite3Str
21160 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
21170 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a  P_FILE_PREFIX);.
21180 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66    int nMax, nBuf
21190 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20  , nDir, nLen;.  
211a0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f  char *zBuf;..  /
211b0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
211c0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
211d0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
211e0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
211f0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
21200 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
21210 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
21220 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
21230 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
21240 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
21250 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
21260 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
21270 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
21280 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
21290 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
212a0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
212b0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
212c0 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f  ile.  ** name fo
212d0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
212e0 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66  file.  If this f
212f0 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20  ails, we cannot 
21300 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20  continue..  */. 
21310 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78   nMax = pVfs->mx
21320 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d  Pathname; nBuf =
21330 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75   nMax + 2;.  zBu
21340 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f = sqlite3Mallo
21350 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20  cZero( nBuf );. 
21360 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20   if( !zBuf ){.  
21370 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
21380 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
21390 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
213a0 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
213b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
213c0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
213d0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66  igure out the ef
213e0 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72  fective temporar
213f0 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69  y directory.  Fi
21400 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e  rst, check if on
21410 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20  e.  ** has been 
21420 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62  explicitly set b
21430 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
21440 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  n; otherwise, us
21450 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63  e the one.  ** c
21460 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65  onfigured by the
21470 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
21480 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d  m..  */.  nDir =
21490 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20   nMax - (nPre + 
214a0 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  15);.  assert( n
214b0 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73  Dir>0 );.  if( s
214c0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
214d0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74  ctory ){.    int
214e0 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74   nDirLen = sqlit
214f0 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
21500 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
21510 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72  y);.    if( nDir
21520 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Len>0 ){.      i
21530 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70 28  f( !winIsDirSep(
21540 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21550 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31  ectory[nDirLen-1
21560 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44  ]) ){.        nD
21570 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  irLen++;.      }
21580 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c  .      if( nDirL
21590 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20  en>nDir ){.     
215a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
215b0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f  zBuf);.        O
215c0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
215d0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
215e0 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
215f0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
21600 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
21610 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74  RROR, 0, "winGet
21620 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a  Tempname1", 0);.
21630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21640 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21650 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
21660 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
21670 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a  rectory);.    }.
21680 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
21690 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
216a0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
216b0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
216c0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30  s[] = {.       0
216d0 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c  , /* getenv("SQL
216e0 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a  ITE_TMPDIR") */.
216f0 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21700 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f  env("TMPDIR") */
21710 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21720 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20  tenv("TMP") */. 
21730 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21740 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20  nv("TEMP") */.  
21750 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
21760 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29  v("USERPROFILE")
21770 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72   */.       "/var
21780 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
21790 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20  usr/tmp",.      
217a0 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20   "/tmp",.       
217b0 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20  ".",.       0   
217c0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72       /* List ter
217d0 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d  minator */.    }
217e0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
217f0 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
21800 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
21810 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
21820 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20  [0] ) azDirs[0] 
21830 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
21840 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  _TMPDIR");.    i
21850 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
21860 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
21870 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
21880 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d    if( !azDirs[2]
21890 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67   ) azDirs[2] = g
218a0 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20  etenv("TMP");.  
218b0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d    if( !azDirs[3]
218c0 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67   ) azDirs[3] = g
218d0 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20  etenv("TEMP");. 
218e0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34     if( !azDirs[4
218f0 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20  ] ) azDirs[4] = 
21900 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46  getenv("USERPROF
21910 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  ILE");.    for(i
21920 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
21930 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
21940 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
21950 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20  irs[i++]){.     
21960 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
21970 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69  d;.      if( zDi
21980 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
21990 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
219a0 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69 74   path starts wit
219b0 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72  h a drive letter
219c0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65   followed by the
219d0 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20   colon.      ** 
219e0 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d  character, assum
219f0 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  e it is already 
21a00 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70  a native Win32 p
21a10 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a  ath; otherwise,.
21a20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74        ** it must
21a30 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   be converted to
21a40 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
21a50 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79 67  path via the Cyg
21a60 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a  win API.      **
21a70 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20   prior to using 
21a80 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
21a90 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76     if( winIsDriv
21aa0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
21ab0 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20  zDir) ){.       
21ac0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
21ad0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
21ae0 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a  Filename(zDir);.
21af0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
21b00 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
21b10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21b20 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
21b30 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21b40 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21b50 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21b60 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
21b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
21b80 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
21b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21ba0 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
21bb0 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
21bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21bd0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
21be0 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20   "%s", zDir);.  
21bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21c00 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21c10 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
21c20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21c30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21c40 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
21c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21c60 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
21c70 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
21c80 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20  ro( nMax+1 );.  
21c90 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76        if( !zConv
21ca0 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20  erted ){.       
21cb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21cc0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21cd0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21ce0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21cf0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
21d00 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
21d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21d20 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
21d30 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21d40 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
21d50 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
21d60 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50    osIsNT() ? CCP
21d70 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
21d80 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
21d90 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20  IN_A, zDir,.    
21da0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e              zCon
21db0 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c  verted, nMax+1)<
21dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
21dd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21de0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21df0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21e00 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21e10 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
21e20 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
21e30 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
21e40 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  H\n"));.        
21e50 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
21e60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
21e70 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  R_CONVPATH, (DWO
21e80 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
21eb0 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b  mpname2", zDir);
21ec0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21ed0 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28     if( winIsDir(
21ee0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
21ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74           /* At t
21f00 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
21f10 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ow the candidate
21f20 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73 74   directory exist
21f30 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20  s and should.   
21f40 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65         ** be use
21f50 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20  d.  However, we 
21f60 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76  may need to conv
21f70 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 63  ert the string c
21f80 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20  ontaining.      
21f90 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20      ** its name 
21fa0 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e  into UTF-8 (i.e.
21fb0 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31 36   if it is UTF-16
21fc0 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20   right now)..   
21fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21fe0 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
21ff0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
22000 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76  f8Filename(zConv
22010 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
22020 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a    if( !zUtf8 ){.
22030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22040 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22050 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
22060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22070 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
22080 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22090 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
220a0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
220b0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
220c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
220d0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
220e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
220f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22100 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
22110 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
22120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22130 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
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 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22160 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
22170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22180 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22190 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
221a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
221b0 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
221c0 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
221d0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
221e0 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54   else if( osIsNT
221f0 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
22200 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53  zMulti;.    LPWS
22210 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73  TR zWidePath = s
22220 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
22230 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43  ( nMax*sizeof(WC
22240 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20  HAR) );.    if( 
22250 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20  !zWidePath ){.  
22260 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22270 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
22280 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22290 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
222a0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
222b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
222c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
222d0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
222e0 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
222f0 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29  nMax, zWidePath)
22300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
22310 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
22320 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
22330 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22340 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22350 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22360 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
22370 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
22380 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
22390 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
223a0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
223b0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
223c0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
223e0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c  inGetTempname2",
223f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
22400 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
22410 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
22420 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
22430 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
22440 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
22450 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
22460 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
22470 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c  qlite3_free(zMul
22480 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
22490 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
224a0 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  h);.    }else{. 
224b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
224c0 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
224d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
224e0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
224f0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22500 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22510 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22520 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22530 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22540 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  M;.    }.  }.#if
22550 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
22560 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
22570 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66  {.    char *zUtf
22580 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62  8;.    char *zMb
22590 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  csPath = sqlite3
225a0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78  MallocZero( nMax
225b0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62   );.    if( !zMb
225c0 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  csPath ){.      
225d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
225e0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
225f0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22600 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22610 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
22620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22630 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47     }.    if( osG
22650 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78  etTempPathA(nMax
22660 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20  , zMbcsPath)==0 
22670 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22680 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22690 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
226a0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
226b0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
226c0 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
226d0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
226e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
226f0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
22700 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
22710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22720 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
22730 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29  etTempname3", 0)
22740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
22750 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  8 = sqlite3_win3
22760 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
22770 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
22780 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
22790 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
227a0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
227b0 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
227c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
227d0 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
227e0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
227f0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22800 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22810 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22820 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22830 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
22840 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22850 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
22860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22870 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
22880 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21  I */.#endif /* !
22890 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
228a0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68  */..  /*.  ** Ch
228b0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
228c0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
228d0 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77 69  irectory ends wi
228e0 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  th an appropriat
228f0 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f 72  e.  ** separator
22900 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
22910 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  t and there is n
22920 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ot enough space 
22930 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a  left to add.  **
22940 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f   one, fail..  */
22950 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65 45  .  if( !winMakeE
22960 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72 2b  ndInDirSep(nDir+
22970 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20 20  1, zBuf) ){.    
22980 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22990 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  f);.    OSTRACE(
229a0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
229b0 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
229c0 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
229d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
229e0 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
229f0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c  inGetTempname4",
22a00 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   0);.  }..  /*. 
22a10 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   ** Check that t
22a20 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
22a30 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
22a40 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
22a50 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
22a60 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  me in the follow
22a70 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a  ing format:.  **
22a80 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72  .  **   "<tempor
22a90 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65  ary_directory>/e
22aa0 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58  tilqs_XXXXXXXXXX
22ab0 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a  XXXXX\0\0".  **.
22ac0 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74    ** If not, ret
22ad0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
22ae0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37  .  The number 17
22af0 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69 6e   is used here in
22b00 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61   order to.  ** a
22b10 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73  ccount for the s
22b20 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
22b30 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72 61   15 character ra
22b40 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20  ndom suffix and 
22b50 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61  the.  ** two tra
22b60 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63  iling NUL charac
22b70 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c  ters.  The final
22b80 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72   directory separ
22b90 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20  ator character. 
22ba0 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
22bb0 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73 20  added if it was 
22bc0 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65 73  not already pres
22bd0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e  ent..  */.  nLen
22be0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
22bf0 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  30(zBuf);.  if( 
22c00 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31  (nLen + nPre + 1
22c10 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20  7) > nBuf ){.   
22c20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22c30 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  uf);.    OSTRACE
22c40 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22c50 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
22c60 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
22c70 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
22c80 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
22c90 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22  winGetTempname5"
22ca0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  , 0);.  }..  sql
22cb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
22cc0 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66  uf-16-nLen, zBuf
22cd0 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45  +nLen, SQLITE_TE
22ce0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
22cf0 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53  ..  j = sqlite3S
22d00 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
22d10 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
22d20 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
22d30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
22d40 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
22d50 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
22d60 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
22d70 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
22d80 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
22d90 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20  rs)-1) ];.  }.  
22da0 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a  zBuf[j] = 0;.  z
22db0 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
22dc0 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a  *pzBuf = zBuf;..
22dd0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22de0 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25  -FILENAME name=%
22df0 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  s, rc=SQLITE_OK\
22e00 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
22e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22e20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22e30 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
22e40 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79  d file is really
22e50 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52   a directory.  R
22e60 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a  eturn false if.*
22e70 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e  * it is somethin
22e80 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64  g other than a d
22e90 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20  irectory, or if 
22ea0 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
22eb0 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  d of memory.** a
22ec0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
22ed0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22ee0 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20   winIsDir(const 
22ef0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
22f00 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
22f10 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
22f20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
22f30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
22f40 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
22f50 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
22f60 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
22f70 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
22f80 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
22f90 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
22fa0 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
22fb0 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
22fc0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
22fd0 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
22fe0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
23010 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23030 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
23040 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
23050 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
23060 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
23070 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
23080 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
23090 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20  * Invalid name? 
230a0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74  */.    }.    att
230b0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
230c0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
230d0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
230e0 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
230f0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
23100 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
23110 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
23120 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
23130 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49   return (attr!=I
23140 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
23150 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72  IBUTES) && (attr
23160 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
23170 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f  DIRECTORY);.}../
23180 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
23190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
231a0 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
231b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
231c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
231d0 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68  get maximum path
231e0 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a   name length */.
231f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
23200 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame,        /* N
23210 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
23220 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
23230 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
23240 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23250 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
23260 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
23270 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
23280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
23290 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  en mode flags */
232a0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
232b0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
232c0 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c  Status return fl
232d0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44  ags */.){.  HAND
232e0 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61  LE h;.  DWORD la
232f0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44  stErrno = 0;.  D
23300 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
23310 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
23320 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
23330 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
23340 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
23350 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
23360 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
23370 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
23380 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
23390 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
233a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
233b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
233c0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
233d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
233e0 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
233f0 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
23400 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
23410 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
23420 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
23430 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
23440 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
23450 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
23460 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
23470 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
23480 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
23490 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
234a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
234b0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
234c0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
234d0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
234e0 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d  char *zTmpname =
234f0 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f   0; /* For tempo
23500 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69  rary filename, i
23510 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a  f necessary. */.
23520 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23530 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
23540 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
23550 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
23560 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
23570 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
23580 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
23590 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
235a0 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
235b0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
235c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
235d0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
235e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
235f0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
23600 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
23610 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23620 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23630 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
23640 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
23650 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23660 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
23670 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
23680 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23690 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
236a0 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
236b0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
236c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
236d0 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
236e0 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
236f0 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
23700 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
23710 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
23720 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
23730 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
23740 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23750 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
23760 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
23770 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
23780 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f   ));.#endif..  O
23790 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
237a0 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c  me=%s, pFile=%p,
237b0 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46   flags=%x, pOutF
237c0 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  lags=%p\n",.    
237d0 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65         zUtf8Name
237e0 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75  , id, flags, pOu
237f0 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20  tFlags));..  /* 
23800 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
23810 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
23820 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
23830 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
23840 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
23850 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
23860 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
23870 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
23880 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
23890 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
238a0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
238b0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
238c0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
238d0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
238e0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
238f0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
23900 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
23910 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
23920 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
23930 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
23940 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
23950 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
23960 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
23970 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
23980 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
23990 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
239a0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
239b0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
239c0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
239d0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
239e0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
239f0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
23a00 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
23a10 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
23a20 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
23a30 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
23a40 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
23a50 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
23a60 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
23a70 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
23a80 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
23a90 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
23aa0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
23ab0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
23ac0 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
23ad0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
23ae0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
23af0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
23b00 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
23b10 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
23b20 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
23b30 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
23b40 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
23b50 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
23b60 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
23b70 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
23b80 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
23b90 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
23ba0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
23bb0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
23bc0 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
23bd0 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
23be0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
23bf0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23c00 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
23c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
23c20 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
23c30 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23c40 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
23c50 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23c60 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
23c70 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
23c80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23c90 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
23ca0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23cb0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
23cc0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
23cd0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23ce0 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
23cf0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23d00 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61  EN_WAL.  );..  a
23d10 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
23d20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
23d30 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  e, 0, sizeof(win
23d40 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
23d50 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
23d60 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20  DLE_VALUE;..#if 
23d70 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
23d80 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
23d90 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d   && !sqlite3_tem
23da0 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
23db0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
23dc0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20  QLITE_ERROR,.   
23dd0 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65       "sqlite3_te
23de0 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72  mp_directory var
23df0 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  iable should be 
23e00 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b  set for WinRT");
23e10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
23e20 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
23e30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
23e40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
23e50 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
23e60 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
23e70 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
23e80 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
23e90 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  8Name ){.    ass
23ea0 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26 26  ert( isDelete &&
23eb0 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20   !isOpenJournal 
23ec0 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 47  );.    rc = winG
23ed0 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c  etTempname(pVfs,
23ee0 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20   &zTmpname);.   
23ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  OK ){.      OSTR
23f10 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
23f20 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66  %s, rc=%s", zUtf
23f30 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  8Name, sqlite3Er
23f40 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
23f50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23f60 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
23f70 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
23f80 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
23f90 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
23fa0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
23fb0 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
23fc0 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
23fd0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
23fe0 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
23ff0 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
24000 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
24010 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
24020 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
24030 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
24040 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
24050 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
24060 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
24070 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61  |.       zUtf8Na
24080 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
24090 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  30(zUtf8Name)+1]
240a0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
240b0 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
240c0 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
240d0 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
240e0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
240f0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
24100 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65  lename(zUtf8Name
24110 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
24120 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
24130 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
24140 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
24150 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
24160 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
24170 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e  R_NOMEM", zUtf8N
24180 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
24190 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
241a0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
241b0 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
241c0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  rted) ){.    sql
241d0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
241e0 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
241f0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
24200 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
24210 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
24220 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  c=SQLITE_CANTOPE
24230 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e  N_ISDIR", zUtf8N
24240 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
24250 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
24260 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20  N_ISDIR;.  }..  
24270 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
24280 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  ){.    dwDesired
24290 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
242a0 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f  _READ | GENERIC_
242b0 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
242c0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
242d0 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
242e0 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51  AD;.  }..  /* SQ
242f0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
24300 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d  IVE is used to m
24310 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20  ake sure that a 
24320 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  new file is .  *
24330 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
24340 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
24350 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
24360 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20  clusive access" 
24370 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
24380 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
24390 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
243a0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
243b0 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
243c0 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
243d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
243e0 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
243f0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
24400 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
24410 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
24420 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
24430 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
24440 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
24450 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
24460 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
24470 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
24480 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
24490 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
244a0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
244b0 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
244c0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
244d0 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
244e0 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
244f0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
24500 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
24510 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
24520 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
24530 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
24540 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
24550 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
24560 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
24570 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
24580 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24590 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
245a0 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
245b0 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
245c0 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
245d0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
245e0 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
245f0 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
24620 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24640 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
24650 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
24660 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
24670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
24680 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24690 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
246a0 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
246b0 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
246c0 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
246d0 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
246e0 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
246f0 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
24700 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
24710 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
24720 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
24730 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24740 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
24750 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
24760 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
24770 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
24780 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
24790 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
247a0 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49  NRT.    CREATEFI
247b0 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
247c0 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64  AMETERS extended
247d0 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20  Parameters;.    
247e0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
247f0 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65  rs.dwSize = size
24800 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45  of(CREATEFILE2_E
24810 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
24820 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  RS);.    extende
24830 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
24840 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20  leAttributes =. 
24850 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
24860 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
24870 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
24880 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
24890 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
248a0 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c  FileFlags = dwFl
248b0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
248c0 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53   & FILE_FLAG_MAS
248d0 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
248e0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75  arameters.dwSecu
248f0 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53  rityQosFlags = S
24900 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55  ECURITY_ANONYMOU
24910 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  S;.    extendedP
24920 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75  arameters.lpSecu
24930 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d  rityAttributes =
24940 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e   NULL;.    exten
24950 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54  dedParameters.hT
24960 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55  emplateFile = NU
24970 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  LL;.    while( (
24980 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
24990 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
249a0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
249d0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
24a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24a20 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
24a30 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72      &extendedPar
24a60 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c  ameters))==INVAL
24a70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
24a80 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
24ab0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
24ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24ad0 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
24ae0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
24af0 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
24b00 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
24b10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
24b40 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
24b70 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
24ba0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
24bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24be0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c00 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
24c10 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24c20 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
24c50 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
24c60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
24c70 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
24c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
24c90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
24ca0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
24cb0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
24cc0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
24cd0 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
24ce0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
24d10 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
24d40 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
24d70 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
24da0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
24dd0 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
24de0 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
24e10 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
24e20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24e40 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
24e50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c   }.#endif.  winL
24e60 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20  ogIoerr(cnt);.. 
24e70 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
24e80 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
24e90 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
24ea0 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
24eb0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
24ec0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24ed0 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
24ee0 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
24ef0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
24f00 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
24f10 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
24f20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
24f30 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
24f40 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
24f50 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
24f60 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
24f70 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
24f80 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
24f90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24fa0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24fb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
24fc0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
24fd0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
24fe0 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
24ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
25000 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
25010 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  , id, .         
25020 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
25030 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a  PEN_READONLY) &.
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50       ~(SQLITE_OP
25060 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
25070 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
25080 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74  ),.         pOut
25090 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
250a0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
250b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
250c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
250d0 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
250e0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
250f0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
25100 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
25110 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
25120 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
25130 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
25140 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
25150 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
25160 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
25170 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61  OPEN file=%p, na
25180 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c  me=%s, access=%l
25190 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c  x, pOutFlags=%p,
251a0 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20   *pOutFlags=%d, 
251b0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63  ".           "rc
251c0 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
251d0 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41  Name, dwDesiredA
251e0 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73  ccess, pOutFlags
251f0 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20  , pOutFlags ?.  
25200 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c           *pOutFl
25210 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56  ags : 0, (h==INV
25220 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
25230 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
25240 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c  "ok"));..#if SQL
25250 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
25260 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
25270 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  & eType==SQLITE_
25280 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20  OPEN_MAIN_DB.   
25290 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
252a0 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
252b0 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
252c0 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
252d0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29  osCloseHandle(h)
252e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
252f0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
25300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25310 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
25320 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43  OSTRACE(("OPEN-C
25330 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20  E-LOCK name=%s, 
25340 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c  rc=%s\n", zName,
25350 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
25360 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rc)));.    retur
25370 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
25380 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
25390 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
253a0 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
253b0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
253c0 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
253d0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
253e0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
253f0 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25400 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  ;.  pFile->pMeth
25410 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od = &winIoMetho
25420 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  d;.  pFile->pVfs
25430 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
25440 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69  ->h = h;.  if( i
25450 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
25460 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
25470 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f  s |= WINFILE_RDO
25480 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
25490 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
254a0 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22  an(zName, "psow"
254b0 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
254c0 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
254d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
254e0 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
254f0 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69  _PSOW;.  }.  pFi
25500 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
25510 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c  NO_ERROR;.  pFil
25520 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
25530 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
25540 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
25550 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
25560 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  L;.  pFile->pMap
25570 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46  Region = 0;.  pF
25580 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
25590 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
255a0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
255b0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
255c0 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
255d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
255e0 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65  p;.#endif..  Ope
255f0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
25600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25610 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
25620 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
25630 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
25640 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
25650 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
25660 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
25670 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
25680 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
25690 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
256a0 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
256b0 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
256c0 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
256d0 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
256e0 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
256f0 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
25700 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
25710 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
25720 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
25730 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
25740 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
25750 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
25760 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
25770 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
25780 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
25790 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
257a0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
257b0 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
257c0 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
257d0 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
257e0 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
257f0 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
25800 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
25810 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
25820 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
25830 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
25840 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
25850 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
25860 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
25870 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
25880 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
25890 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
258a0 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
258b0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
258e0 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
258f0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
25900 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
25910 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
25920 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
25930 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
25940 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
25950 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
25960 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
25970 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
25980 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
25990 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
259a0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
259b0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
259c0 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a  syncDir=%d\n", z
259d0 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69  Filename, syncDi
259e0 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  r));..  zConvert
259f0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
25a00 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
25a10 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
25a20 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
25a30 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
25a40 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
25a50 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
25a60 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
25a70 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
25a80 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
25a90 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
25aa0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
25ab0 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
25ac0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
25ad0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
25ae0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
25af0 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
25b00 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
25b10 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
25b20 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
25b30 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
25b40 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
25b50 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
25b60 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
25b90 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
25ba0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
25bb0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
25bc0 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
25bd0 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
25be0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
25bf0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
25c00 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
25c10 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
25c20 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
25c30 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
25c40 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
25c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25c60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
25c70 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
25c80 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
25c90 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
25ca0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25cb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25cd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
25ce0 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
25cf0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
25d00 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
25d10 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
25d20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
25d30 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
25d40 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
25d50 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
25d60 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
25d70 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
25d80 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
25d90 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
25da0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
25db0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
25dc0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
25dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25de0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
25df0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
25e00 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
25e10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
25e20 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25e30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25e50 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
25e60 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
25e70 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
25e80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25e90 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
25ea0 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
25eb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25ec0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
25ed0 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
25ee0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
25ef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25f00 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
25f10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
25f20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25f30 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
25f40 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
25f50 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
25f60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
25f70 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
25f80 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
25f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25fa0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
25fb0 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
25fc0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
25fd0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
25fe0 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
25ff0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
26000 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
26010 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
26020 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
26030 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
26040 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
26050 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
26060 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
26070 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
26080 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
26090 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
260a0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
260b0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
260c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
260d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
260e0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
260f0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
26100 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26120 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
26140 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26150 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
26160 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
26170 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
26180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26190 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
261a0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
261b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
261c0 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
261d0 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
261e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
261f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
26200 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
26210 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26220 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
26230 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
26240 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26250 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26260 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
26270 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
26280 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
26290 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
262a0 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
262b0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
262c0 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  c && rc!=SQLITE_
262d0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
262e0 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  NT ){.    rc = w
262f0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
26300 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
26310 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44  lastErrno, "winD
26320 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
26330 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26340 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
26350 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
26360 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
26370 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
26380 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
26390 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
263a0 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
263b0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
263c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
263d0 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
263e0 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
263f0 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
26400 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
26410 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
26420 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
26430 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
26440 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
26450 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
26460 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
26470 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
26480 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
264a0 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
264b0 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
264c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
264d0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
264e0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
264f0 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
26500 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
26510 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
26520 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
26530 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
26540 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26550 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
26560 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
26570 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26580 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53  _ACCESS; );.  OS
26590 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
265a0 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78  ame=%s, flags=%x
265b0 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
265d0 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52  ename, flags, pR
265e0 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e  esOut));..  zCon
265f0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
26600 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
26610 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
26620 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
26630 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
26640 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
26650 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
26660 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
26670 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
26680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26690 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
266a0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
266b0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
266c0 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
266d0 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
266e0 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
266f0 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
26700 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
26710 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
26720 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
26730 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
26740 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
26750 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
26760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26770 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
26780 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20  oStandard, .    
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267a0 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
267b0 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
267c0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
267d0 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
267e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
267f0 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
26800 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
26810 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
26820 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
26830 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
26840 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
26850 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26860 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
26870 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
26880 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
26890 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
268a0 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20  SizeHigh==0 .   
268b0 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
268c0 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
268d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
268e0 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
268f0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
26900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26910 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
26920 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
26930 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
26940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26950 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29  winLogIoerr(cnt)
26960 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
26970 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c  Errno!=ERROR_FIL
26980 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c  E_NOT_FOUND && l
26990 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
269a0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
269b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
269c0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
269d0 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
269e0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
269f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
26a00 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  SS, lastErrno, "
26a10 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20  winAccess",.    
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
26a40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26a50 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
26a60 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
26a70 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
26a80 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
26a90 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
26aa0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
26ab0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
26ac0 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
26ad0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
26ae0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
26af0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26b00 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
26b10 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
26b20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
26b30 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
26b40 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
26b50 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
26b60 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
26b70 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
26b80 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
26b90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
26ba0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
26bb0 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
26bc0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
26bd0 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
26be0 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
26bf0 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
26c00 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
26c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26c20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
26c30 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
26c40 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
26c50 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
26c60 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
26c70 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
26c80 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %s, pResOut=%p, 
26c90 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
26ca0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
26cb0 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
26cc0 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  me, pResOut, *pR
26cd0 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
26ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26cf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
26d00 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
26d10 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
26d20 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
26d30 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20  drive letter.** 
26d40 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
26d50 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  lon character..*
26d60 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
26d70 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
26d80 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20  dColon(.  const 
26d90 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
26da0 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71  ){.  return ( sq
26db0 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
26dc0 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
26dd0 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
26de0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
26df0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
26e00 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
26e10 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62  th name should b
26e20 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e  e used verbatim.
26e30 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f    If.** non-zero
26e40 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f   is returned fro
26e50 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  m this function,
26e60 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
26e70 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c  ction must simpl
26e80 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f  y.** use the pro
26e90 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20  vided path name 
26ea0 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65  verbatim -OR- re
26eb0 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20  solve it into a 
26ec0 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a  full path name.*
26ed0 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46  * using the GetF
26ee0 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33  ullPathName Win3
26ef0 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28  2 API function (
26f00 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
26f10 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
26f20 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
26f30 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame(.  const cha
26f40 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
26f50 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
26f60 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
26f70 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64  s with a forward
26f80 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b   slash or a back
26f90 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74  slash, it is eit
26fa0 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c  her.  ** a legal
26fb0 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c   UNC name, a vol
26fc0 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  ume relative pat
26fd0 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  h, or an absolut
26fe0 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74  e path name in t
26ff0 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66  he.  ** "Unix" f
27000 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73  ormat on Windows
27010 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65  .  There is no e
27020 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65  asy way to diffe
27030 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
27040 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
27050 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65  two cases; there
27060 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20  fore, we return 
27070 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e  the safer return
27080 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20   value of TRUE. 
27090 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c   ** so that call
270a0 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
270b0 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79  tion will simply
270c0 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
270d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69  ..  */.  if ( wi
270e0 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e  nIsDirSep(zPathn
270f0 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72  ame[0]) ){.    r
27100 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
27110 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
27120 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
27130 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72  ts with a letter
27140 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20   and a colon it 
27150 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75  is either a volu
27160 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  me.  ** relative
27170 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f   path or an abso
27180 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c  lute path.  Call
27190 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
271a0 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20  tion must not.  
271b0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72  ** attempt to tr
271c0 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61  eat it as a rela
271d0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28  tive path name (
271e0 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64  i.e. they should
271f0 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a   simply use.  **
27200 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20   it verbatim).. 
27210 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
27220 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
27230 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29  lon(zPathname) )
27240 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
27250 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
27260 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74  * If we get to t
27270 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70  his point, the p
27280 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
27290 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
272a0 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a   be a purely.  *
272b0 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28  * relative one (
272c0 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e  i.e. not a UNC n
272d0 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74  ame, not absolut
272e0 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d  e, and not volum
272f0 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a  e relative)..  *
27300 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  /.  return FALSE
27310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
27320 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
27330 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
27340 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
27350 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
27360 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
27370 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
27380 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
27390 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
273a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
273b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
273c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
273d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
273e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
273f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
27400 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
27410 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
27420 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
27430 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
27440 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
27450 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27470 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
27480 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
27490 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
274c0 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
274d0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
274e0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
274f0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
27500 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
27510 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
27520 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72  (nFull);.  asser
27530 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e  t( nFull>=pVfs->
27540 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
27550 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
27560 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
27570 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
27580 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
27590 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
275a0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
275b0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
275c0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
275d0 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
275e0 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
275f0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
27600 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
27610 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
27620 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
27630 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
27640 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
27650 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
27660 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
27670 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
27680 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
27690 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61  ectory and a sla
276a0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  sh..    */.    c
276b0 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
276c0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
276d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
276e0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
276f0 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
27700 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27710 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
27720 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
27730 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
27740 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43     (osIsNT() ? C
27750 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
27760 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
27770 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20  _WIN_A) |.      
27780 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49        CCP_RELATI
27790 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  VE, zRelative, z
277a0 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
277b0 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
277c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
277d0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
277e0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
277f0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
27800 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
27810 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
27840 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me1", zRelative)
27850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27860 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
27870 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
27880 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
27890 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
278a0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
278b0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
278c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
278d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
278e0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
278f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27900 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
27910 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
27920 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22   zFull, "%s%c%s"
27930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27950 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
27960 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
27970 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
27980 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
27990 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
279a0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
279b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
279c0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
279d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
279e0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
279f0 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
27a00 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
27a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27a20 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
27a30 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
27a40 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
27a50 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
27a60 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
27a70 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
27a80 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20  TO_WIN_A),.     
27a90 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65         zRelative
27aa0 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
27ab0 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
27ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27ad0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
27ae0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
27af0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
27b00 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
27b10 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b30 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
27b40 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69  hname2", zRelati
27b50 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
27b60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
27b70 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
27b80 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
27b90 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
27ba0 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
27bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27bc0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
27bd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27be0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
27bf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
27c00 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27c10 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27c20 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
27c30 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
27c40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
27c50 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
27c60 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27c70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
27c90 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  if..#if (SQLITE_
27ca0 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
27cb0 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20  TE_OS_WINRT) && 
27cc0 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
27cd0 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
27ce0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
27cf0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
27d00 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f   /* WinCE has no
27d10 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65   concept of a re
27d20 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c  lative pathname,
27d30 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64   or so I am told
27d40 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20  . */.  /* WinRT 
27d50 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f  has no way to co
27d60 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65  nvert a relative
27d70 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f   path to an abso
27d80 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69  lute one. */.  i
27d90 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
27da0 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
27db0 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
27dc0 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
27dd0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
27de0 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
27df0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
27e00 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
27e10 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
27e20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
27e30 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
27e40 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
27e50 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
27e60 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
27e70 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
27e80 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
27e90 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
27ea0 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
27eb0 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
27ec0 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
27ed0 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b  ctory and a back
27ee0 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
27ef0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27f00 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
27f10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
27f20 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22   zFull, "%s%c%s"
27f30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
27f50 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
27f60 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
27f70 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c  Relative);.  }el
27f80 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
27f90 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
27fa0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
27fb0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
27fc0 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
27fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
27fe0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
27ff0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
28000 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
28010 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
28020 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
28030 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a  .  DWORD nByte;.
28040 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
28050 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
28060 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
28070 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73  path name begins
28080 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65   with "/X:", whe
28090 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c  re "X" is any al
280a0 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68  phabetic.  ** ch
280b0 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64  aracter, discard
280c0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22   the initial "/"
280d0 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61   from the pathna
280e0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  me..  */.  if( z
280f0 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
28100 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65   && winIsDriveLe
28110 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65  tterAndColon(zRe
28120 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20  lative+1) ){.   
28130 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20   zRelative++;.  
28140 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  }..  /* It's odd
28150 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
28160 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
28170 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
28180 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
28190 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
281a0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
281b0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
281c0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
281d0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
281e0 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
281f0 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
28200 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
28210 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
28220 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
28230 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
28240 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
28250 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
28260 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
28270 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
28280 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
28290 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
282a0 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
282b0 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
282c0 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
282d0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
282e0 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
282f0 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
28300 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
28310 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
28320 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
28330 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
28340 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
28350 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
28360 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
28370 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
28380 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
28390 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
283a0 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
283b0 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
283c0 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
283d0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
283e0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
283f0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
28400 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
28410 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
28430 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
28440 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
28450 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Sep(), zRelative
28460 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
28480 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
28490 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
284a0 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
284b0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
284c0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
284d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
284e0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
284f0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
28500 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
28510 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
28520 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
28530 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
28540 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
28550 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
28560 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28570 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28580 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28590 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
285a0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
285b0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
285c0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
285f0 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
28600 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
28610 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
28620 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
28630 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
28640 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
28650 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
28660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28670 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28680 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
28690 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
286a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
286b0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
286c0 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
286d0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
286e0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
286f0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
28700 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28710 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28720 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
28730 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
28740 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
28750 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28760 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
28770 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
28780 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
287a0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
287b0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
287c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
287d0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
287e0 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
287f0 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
28800 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
28810 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
28820 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
28830 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
28840 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
28850 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
28860 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
28870 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
28880 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
28890 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
288a0 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
288b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
288c0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
288d0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
288e0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
288f0 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
28900 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
28930 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61  athname3", zRela
28940 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
28950 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
28960 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
28970 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
28980 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
28990 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
289a0 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
289b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
289c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
289d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
289e0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
289f0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
28a00 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
28a10 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
28a20 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
28a30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
28a40 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
28a50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28a60 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
28a70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
28a80 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
28a90 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
28aa0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
28ab0 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
28ac0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
28af0 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me4", zRelative)
28b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
28b10 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28b20 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
28b30 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
28b40 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
28b50 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
28b60 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
28b70 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f  .#endif.  if( zO
28b80 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
28b90 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
28ba0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
28bb0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
28bc0 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
28bd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
28be0 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ut);.    return 
28bf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
28c00 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
28c10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28c20 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  M;.  }.#endif.}.
28c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28c40 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
28c50 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
28c60 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
28c70 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
28c80 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
28c90 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
28ca0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
28cb0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
28cc0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
28cd0 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
28ce0 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
28cf0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28d00 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
28d10 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
28d20 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
28d30 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
28d40 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
28d50 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
28d60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28d70 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
28d80 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
28d90 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
28da0 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
28db0 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
28dc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
28dd0 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
28de0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  n 0;.  }.  if( o
28df0 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
28e00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
28e10 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63     h = osLoadPac
28e20 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50  kagedLibrary((LP
28e30 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28e40 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
28e50 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
28e60 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  yW((LPCWSTR)zCon
28e70 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
28e80 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
28e90 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
28ea0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d  .  else{.    h =
28eb0 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
28ec0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
28ed0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
28ee0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
28ef0 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
28f00 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
28f10 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a  me, (void*)h));.
28f20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28f30 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
28f40 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
28f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
28f60 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
28f70 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
28f80 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
28f90 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
28fa0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
28fb0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
28fc0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
28fd0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
28fe0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
28ff0 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
29000 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29010 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
29020 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
29030 64 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72  d){.  FARPROC pr
29040 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  oc;.  UNUSED_PAR
29050 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29060 70 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63  proc = osGetProc
29070 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
29080 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53  )pH, zSym);.  OS
29090 54 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61  TRACE(("DLSYM ha
290a0 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d  ndle=%p, symbol=
290b0 25 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e  %s, address=%p\n
290c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76  ",.           (v
290d0 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28  oid*)pH, zSym, (
290e0 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20  void*)proc));.  
290f0 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
29100 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74  void))proc;.}.st
29110 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
29120 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
29130 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
29140 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
29150 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29160 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
29170 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
29180 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
29190 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25  DLCLOSE handle=%
291a0 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61  p\n", (void*)pHa
291b0 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20  ndle));.}.#else 
291c0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
291d0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
291e0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
291f0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
29200 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
29210 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
29220 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
29230 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
29240 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
29250 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
29260 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
29270 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
29280 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
29290 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
292a0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
292b0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
292c0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
292d0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
292e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
292f0 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
29300 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
29310 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
29320 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
29330 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
29340 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
29350 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
29360 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
29370 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
29380 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
29390 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
293a0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
293b0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
293c0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
293d0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
293e0 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
293f0 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
29400 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
29410 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
29420 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
29430 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
29440 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
29450 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
29460 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a  _WINRT.  if( siz
29470 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d  eof(ULONGLONG)<=
29480 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c  nBuf-n ){.    UL
29490 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
294a0 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
294b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
294c0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
294d0 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
294e0 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
294f0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
29500 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
29510 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
29520 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
29530 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
29540 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
29550 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
29560 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
29570 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
29580 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65  endif.  if( size
29590 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
295a0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
295b0 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
295c0 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
295d0 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
295e0 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
295f0 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
29600 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
29610 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
29620 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
29630 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
29640 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
29650 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
29660 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
29670 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
29680 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
29690 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
296a0 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
296b0 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69  c){.  sqlite3_wi
296c0 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f  n32_sleep((micro
296d0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
296e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
296f0 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
29700 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
29710 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
29720 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
29730 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
29740 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
29750 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
29760 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
29770 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
29780 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
29790 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
297a0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
297b0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
297c0 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
297d0 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
297e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
297f0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
29800 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
29810 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
29820 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
29830 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
29840 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
29850 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
29860 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
29870 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
29880 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
29890 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
298a0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
298b0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
298c0 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
298d0 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
298e0 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
298f0 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
29900 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
29910 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
29920 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
29930 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
29940 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
29950 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
29960 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
29970 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
29980 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
29990 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
299a0 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
299b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
299c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
299d0 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
299e0 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
299f0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
29a00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
29a10 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
29a20 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29a30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
29a40 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c  piNow){.  /* FIL
29a50 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20  ETIME structure 
29a60 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75  is a 64-bit valu
29a70 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  e representing t
29a80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  he number of .  
29a90 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
29aa0 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
29ab0 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
29ac0 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
29ad0 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45  5). .  */.  FILE
29ae0 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69  TIME ft;.  stati
29af0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
29b00 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d  int64 winFiletim
29b10 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33  eEpoch = 2305813
29b20 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
29b30 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66  )8640000;.#ifdef
29b40 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
29b50 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
29b60 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
29b70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
29b80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
29b90 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20  40000;.#endif.  
29ba0 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f  /* 2^32 - to avo
29bb0 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64  id use of LL and
29bc0 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63   warnings in gcc
29bd0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
29be0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
29bf0 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d   max32BitValue =
29c00 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33   .      (sqlite3
29c10 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
29c20 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
29c30 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a  64)2000000000 +.
29c40 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
29c50 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
29c60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
29c70 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
29c80 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53  E time;.  osGetS
29c90 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
29ca0 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d  ;.  /* if System
29cb0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29  TimeToFileTime()
29cc0 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72   fails, it retur
29cd0 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  ns zero. */.  if
29ce0 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54   (!osSystemTimeT
29cf0 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
29d00 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
29d10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29d20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65    }.#else.  osGe
29d30 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
29d40 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
29d50 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
29d60 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
29d70 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
29d80 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
29d90 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
29da0 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
29db0 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
29dc0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
29dd0 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
29de0 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
29df0 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
29e00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
29e10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
29e20 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
29e30 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
29e40 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
29e50 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
29e60 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
29e70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
29e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29e90 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
29ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29eb0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
29ec0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
29ed0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
29ee0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
29ef0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
29f00 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
29f10 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
29f20 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
29f30 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
29f40 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
29f50 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
29f60 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
29f70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29f80 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
29f90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29fa0 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
29fb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
29fc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
29fd0 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
29fe0 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
29ff0 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
2a000 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
2a010 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2a020 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a030 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
2a040 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
2a050 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
2a060 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
2a070 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
2a080 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
2a090 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64  essage() on Wind
2a0a0 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
2a0b0 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
2a0c0 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65  ) on Unix). Afte
2a0d0 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
2a0e0 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
2a0f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
2a100 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2a110 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
2a120 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
2a130 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
2a140 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
2a150 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
2a160 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
2a170 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
2a180 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2a190 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
2a1a0 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
2a1b0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
2a1c0 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
2a1d0 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
2a1e0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
2a1f0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
2a200 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2a210 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
2a220 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
2a230 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
2a240 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
2a250 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2a260 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
2a270 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
2a280 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2a290 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
2a2a0 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
2a2b0 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
2a2c0 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
2a2d0 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
2a2e0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
2a2f0 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
2a300 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
2a310 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
2a320 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
2a330 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
2a340 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
2a350 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
2a360 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
2a370 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
2a380 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
2a390 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
2a3a0 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
2a3b0 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
2a3c0 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
2a3d0 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
2a3e0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2a3f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
2a400 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2a410 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2a420 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2a430 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
2a440 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
2a450 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
2a460 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
2a470 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
2a480 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2a490 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
2a4a0 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
2a4b0 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
2a4c0 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
2a4d0 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
2a4e0 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
2a4f0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
2a500 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
2a510 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
2a520 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
2a530 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2a540 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2a550 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2a560 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2a570 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
2a580 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2a590 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69  fs);.  return wi
2a5a0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
2a5b0 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
2a5c0 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
2a5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2a5e0 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
2a5f0 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
2a600 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
2a610 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
2a620 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
2a630 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
2a640 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
2a650 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2a660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
2a670 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
2a680 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
2a690 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2a6a0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2a6b0 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
2a6c0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2a6d0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6f0 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
2a700 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
2a710 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2a720 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2a730 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2a740 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2a750 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2a760 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2a770 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2a780 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2a790 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
2a7a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2a7b0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2a7c0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2a7d0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2a7e0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2a7f0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2a800 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2a810 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2a820 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
2a830 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
2a840 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
2a850 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2a860 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2a870 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2a880 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2a890 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
2a8a0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2a8b0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2a8c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
2a8d0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
2a8e0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
2a8f0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2a900 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2a910 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
2a920 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2a930 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2a940 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
2a950 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2a960 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2a970 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
2a980 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2a990 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
2a9a0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
2a9b0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2a9c0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
2a9d0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
2a9e0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2a9f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2aa00 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2aa10 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  ).  static sqlit
2aa20 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61  e3_vfs winLongPa
2aa30 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  thVfs = {.    3,
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2aa60 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
2aa70 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a  File),     /* sz
2aa80 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2aa90 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
2aaa0 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2aab0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2aac0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2aad0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
2aae0 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67  .    "win32-long
2aaf0 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61  path",    /* zNa
2ab00 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab20 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
2ab30 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
2ab40 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2ab50 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
2ab60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2ab70 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2ab80 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2ab90 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
2aba0 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
2abb0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
2abc0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
2abd0 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
2abe0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2abf0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2ac00 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
2ac10 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
2ac20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
2ac30 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
2ac40 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
2ac50 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
2ac60 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
2ac70 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
2ac80 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2ac90 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
2aca0 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
2acb0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2acc0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2acd0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
2ace0 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
2acf0 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
2ad00 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2ad10 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
2ad20 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
2ad30 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2ad40 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2ad50 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
2ad60 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
2ad70 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
2ad80 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2ad90 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
2ada0 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
2adb0 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
2adc0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
2add0 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  .  };.#endif..  
2ade0 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20  /* Double-check 
2adf0 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c  that the aSyscal
2ae00 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65  l[] array has be
2ae10 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  en constructed. 
2ae20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20   ** correctly.  
2ae30 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61  See ticket [bb3a
2ae40 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a  86e890c8e96ab] *
2ae50 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  /.  assert( Arra
2ae60 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d  ySize(aSyscall)=
2ae70 3d 37 36 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74  =76 );..  /* get
2ae80 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
2ae90 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
2aea0 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
2aeb0 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
2aec0 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
2aed0 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
2aee0 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
2aef0 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
2af00 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
2af10 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2af20 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2af30 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
2af40 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
2af50 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
2af60 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20  nularity>0 );.  
2af70 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
2af80 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20  fo.dwPageSize>0 
2af90 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  );..  sqlite3_vf
2afa0 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56  s_register(&winV
2afb0 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66  fs, 1);..#if def
2afc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2afd0 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71  2_HAS_WIDE).  sq
2afe0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
2aff0 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56  er(&winLongPathV
2b000 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  fs, 0);.#endif..
2b010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b020 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  OK; .}..int sqli
2b030 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
2b040 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  { .#if SQLITE_OS
2b050 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65  _WINRT.  if( sle
2b060 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj!=NULL ){. 
2b070 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
2b080 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20  (sleepObj);.    
2b090 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
2b0a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2b0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b0c0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
2b0d0 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a        ITE_OS_WIN */.