/ Hex Artifact Content
Login

Artifact 2a08242b7ed8feaf17f73bf60dcc18820123f4ba:


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 4d 61 78 69 6d 75 6d  f../*.** Maximum
06c0: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
06d0: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
06e0: 57 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f  Win32.  This sho
06f0: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0700: 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a  ** MAX_PATH..*/.
0710: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0720: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48  IN32_MAX_PATH_CH
0730: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0740: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0750: 41 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58  ATH_CHARS   (MAX
0760: 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f  _PATH).#endif../
0770: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0780: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0790: 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e   chars) for WinN
07a0: 54 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  T.  This should 
07b0: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 33  normally be.** 3
07c0: 32 37 36 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2767..*/.#ifndef
07d0: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
07e0: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0800: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0810: 52 53 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e  RS   (32767).#en
0820: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0830: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0840: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0850: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0860: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0870: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0880: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0890: 20 33 20 62 79 74 65 73 20 70 65 72 20 63 68 61   3 bytes per cha
08a0: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
08b0: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
08c0: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
08d0: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
08e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
08f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0900: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0910: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0920: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0930: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
0940: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
0950: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0960: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0970: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
0980: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
0990: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
09a0: 79 20 62 65 0a 2a 2a 20 33 32 37 36 37 20 2a 20  y be.** 32767 * 
09b0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a  sizeof(WCHAR)..*
09c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
09d0: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
09e0: 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20  BYTES.#  define 
09f0: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0a00: 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a  _PATH_BYTES   \.
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
0a30: 65 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c  eof(WCHAR) * SQL
0a40: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0a50: 54 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66  TH_CHARS).#endif
0a60: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0a70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65  error message le
0a80: 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20  ngth (in chars) 
0a90: 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69  for WinRT..*/.#i
0aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0ab0: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
0ac0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
0ae0: 52 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32  RRMSG_CHARS (102
0af0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0b00: 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
0b10: 6f 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74  o if the charact
0b20: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65  er should be tre
0b30: 61 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74  ated as a direct
0b40: 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72  ory.** separator
0b50: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e  ..*/.#ifndef win
0b60: 49 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69  IsDirSep.#  defi
0b70: 6e 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61  ne winIsDirSep(a
0b80: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
0b90: 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c   (((a) == '/') |
0ba0: 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29  | ((a) == '\\'))
0bb0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0bc0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
0bd0: 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76  d when a local v
0be0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
0bf0: 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  o a value that i
0c00: 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d  s.** [sometimes]
0c10: 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
0c20: 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 69 61 20   code (e.g. via 
0c30: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70  conditional comp
0c40: 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66  ilation)..*/.#if
0c50: 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 41 52 49  ndef UNUSED_VARI
0c60: 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 20 64 65  ABLE_VALUE.#  de
0c70: 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 41 52 49  fine UNUSED_VARI
0c80: 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 20 28 76  ABLE_VALUE(x) (v
0c90: 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a  oid)(x).#endif..
0ca0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  /*.** Returns th
0cb0: 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  e character that
0cc0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
0cd0: 61 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  as the directory
0ce0: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23   separator..*/.#
0cf0: 69 66 6e 64 65 66 20 77 69 6e 47 65 74 44 69 72  ifndef winGetDir
0d00: 53 65 70 0a 23 20 20 64 65 66 69 6e 65 20 77 69  Sep.#  define wi
0d10: 6e 47 65 74 44 69 72 53 65 70 28 29 20 20 20 20  nGetDirSep()    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 27 5c 5c 27              '\\'
0d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
0d40: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e  o we need to man
0d50: 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74 68 65  ually define the
0d60: 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61 70 70   Win32 file mapp
0d70: 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75 73 65  ing APIs for use
0d80: 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64   with WAL.** mod
0d90: 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50  e (e.g. these AP
0da0: 49 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  Is are available
0db0: 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 20   in the Windows 
0dc0: 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c  CE SDK; however,
0dd0: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74   they.** are not
0de0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
0df0: 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f  header file)?.*/
0e00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  .#if SQLITE_WIN3
0e10: 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50  2_FILEMAPPING_AP
0e20: 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  I && !defined(SQ
0e30: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f  LITE_OMIT_WAL)./
0e40: 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65 20  *.** Two of the 
0e50: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
0e60: 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  s are different 
0e70: 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20 46 69  under WinRT.  Fi
0e80: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 0a 2a  gure out which.*
0e90: 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a  * set we need..*
0ea0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
0eb0: 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41 50 49  WINRT.WINBASEAPI
0ec0: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
0ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
0ee0: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20  FromApp(HANDLE, 
0ef0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
0f00: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
0f10: 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c   ULONG, ULONG64,
0f20: 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42   LPCWSTR);..WINB
0f30: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0f40: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0f50: 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  leFromApp(HANDLE
0f60: 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34  , ULONG, ULONG64
0f70: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65  , SIZE_T);.#else
0f80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f90: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0fa0: 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  SI).WINBASEAPI H
0fb0: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
0fc0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
0fd0: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
0fe0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
0ff0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
1000: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
1010: 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  CSTR);.#endif /*
1020: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1030: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
1040: 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1050: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1060: 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45 41 50  _WIDE).WINBASEAP
1070: 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20  I HANDLE WINAPI 
1080: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1090: 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43  gW(HANDLE, LPSEC
10a0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
10b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
10c0: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
10d0: 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e 64 69   LPCWSTR);.#endi
10e0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
10f0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1100: 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41  DE) */..WINBASEA
1110: 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50 49  PI LPVOID WINAPI
1120: 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 48   MapViewOfFile(H
1130: 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57  ANDLE, DWORD, DW
1140: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45  ORD, DWORD, SIZE
1150: 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _T);.#endif /* S
1160: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
1170: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69  /../*.** This fi
1180: 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 20 69  le mapping API i
1190: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68  s common to both
11a0: 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e 52 54   Win32 and WinRT
11b0: 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50 49 20  ..*/.WINBASEAPI 
11c0: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61  BOOL WINAPI Unma
11d0: 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50 43 56  pViewOfFile(LPCV
11e0: 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  OID);.#endif /* 
11f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c  SQLITE_WIN32_FIL
1200: 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20  EMAPPING_API && 
1210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1220: 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a  OMIT_WAL) */../*
1230: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
1240: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
1250: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
1260: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
1270: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1280: 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65 20 49  BUTES.# define I
1290: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
12a0: 49 42 55 54 45 53 20 28 28 44 57 4f 52 44 29 2d  IBUTES ((DWORD)-
12b0: 31 29 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  1) .#endif..#ifn
12c0: 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  def FILE_FLAG_MA
12d0: 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45  SK.# define FILE
12e0: 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20 20  _FLAG_MASK      
12f0: 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30 29      (0xFF3C0000)
1300: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1310: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1320: 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49  MASK.# define FI
1330: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
1340: 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46 46  K     (0x0003FFF
1350: 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  7).#endif..#ifnd
1360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1370: 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  AL./* Forward re
1380: 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 72 75  ferences to stru
1390: 63 74 75 72 65 73 20 75 73 65 64 20 66 6f 72 20  ctures used for 
13a0: 57 41 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  WAL */.typedef s
13b0: 74 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e  truct winShm win
13c0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
13d0: 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  * A connection t
13e0: 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  o shared-memory 
13f0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1400: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e  t winShmNode win
1410: 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20  ShmNode;   /* A 
1420: 72 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64  region of shared
1430: 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69  -memory */.#endi
1440: 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c  f../*.** WinCE l
1450: 61 63 6b 73 20 6e 61 74 69 76 65 20 73 75 70 70  acks native supp
1460: 6f 72 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63  ort for file loc
1470: 6b 69 6e 67 20 73 6f 20 77 65 20 68 61 76 65 20  king so we have 
1480: 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69  to fake it.** wi
1490: 74 68 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20  th some code of 
14a0: 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20  our own..*/.#if 
14b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
14c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
14d0: 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74  inceLock {.  int
14e0: 20 6e 52 65 61 64 65 72 73 3b 20 20 20 20 20 20   nReaders;      
14f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
1500: 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69  ader locks obtai
1510: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50  ned */.  BOOL bP
1520: 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20  ending;      /* 
1530: 49 6e 64 69 63 61 74 65 73 20 61 20 70 65 6e 64  Indicates a pend
1540: 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ing lock has bee
1550: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
1560: 42 4f 4f 4c 20 62 52 65 73 65 72 76 65 64 3b 20  BOOL bReserved; 
1570: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
1580: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1590: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
15a0: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78  ed */.  BOOL bEx
15b0: 63 6c 75 73 69 76 65 3b 20 20 20 20 2f 2a 20 49  clusive;    /* I
15c0: 6e 64 69 63 61 74 65 73 20 61 6e 20 65 78 63 6c  ndicates an excl
15d0: 75 73 69 76 65 20 6c 6f 63 6b 20 68 61 73 20 62  usive lock has b
15e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
15f0: 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e  } winceLock;.#en
1600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  dif../*.** The w
1610: 69 6e 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  inFile structure
1620: 20 69 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f   is a subclass o
1630: 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20  f sqlite3_file* 
1640: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
1650: 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69  win32.** portabi
1660: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74  lity layer..*/.t
1670: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69  ypedef struct wi
1680: 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73  nFile winFile;.s
1690: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a  truct winFile {.
16a0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
16b0: 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74  io_methods *pMet
16c0: 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62  hod; /*** Must b
16d0: 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73  e first ***/.  s
16e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
16f0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46  ;      /* The VF
1700: 53 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  S used to open t
1710: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41  his file */.  HA
1720: 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20  NDLE h;         
1730: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1740: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68  for accessing th
1750: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c  e file */.  u8 l
1760: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
1770: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c      /* Type of l
1780: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ock currently he
1790: 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ld on this file 
17a0: 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65  */.  short share
17b0: 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20  dLockByte;   /* 
17c0: 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20  Randomly chosen 
17d0: 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20 73  byte used as a s
17e0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  hared lock */.  
17f0: 75 38 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  u8 ctrlFlags;   
1800: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1810: 2e 20 20 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a  .  See WINFILE_*
1820: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52   below */.  DWOR
1830: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
1840: 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f      /* The Windo
1850: 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68  ws errno from th
1860: 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72  e last I/O error
1870: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1880: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69  TE_OMIT_WAL.  wi
1890: 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20  nShm *pShm;     
18a0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63        /* Instanc
18b0: 65 20 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f  e of shared memo
18c0: 72 79 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ry on this file 
18d0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73  */.#endif.  cons
18e0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20  t char *zPath;  
18f0: 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1900: 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 69 6c  name of this fil
1910: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75  e */.  int szChu
1920: 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nk;            /
1930: 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e  * Chunk size con
1940: 66 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c  figured by FCNTL
1950: 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23  _CHUNK_SIZE */.#
1960: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1970: 43 45 0a 20 20 4c 50 57 53 54 52 20 7a 44 65 6c  CE.  LPWSTR zDel
1980: 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20  eteOnClose;  /* 
1990: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
19a0: 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f 73  delete when clos
19b0: 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ing */.  HANDLE 
19c0: 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  hMutex;         
19d0: 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20 74   /* Mutex used t
19e0: 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
19f0: 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b 20   to shared lock 
1a00: 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68 53  */  .  HANDLE hS
1a10: 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f  hared;         /
1a20: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
1a30: 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72  segment used for
1a40: 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69   locking */.  wi
1a50: 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20  nceLock local;  
1a60: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f        /* Locks o
1a70: 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73 20  btained by this 
1a80: 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46  instance of winF
1a90: 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ile */.  winceLo
1aa0: 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20  ck *shared;     
1ab0: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65   /* Global share
1ac0: 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f  d lock memory fo
1ad0: 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23  r the file  */.#
1ae0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1af0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1b00: 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74  .  int nFetchOut
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1b30: 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1b40: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20   references */. 
1b50: 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b70: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
1b80: 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61  essing memory ma
1b90: 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20  pping */.  void 
1ba0: 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20  *pMapRegion;    
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61           /* Area
1bc0: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a   memory mapped *
1bd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1be0: 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20  4 mmapSize;     
1bf0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1c00: 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f   of mapped regio
1c10: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1c20: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74  nt64 mmapSizeAct
1c30: 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73  ual; /* Actual s
1c40: 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65  ize of mapped re
1c50: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
1c60: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1c70: 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69  Max;    /* Confi
1c80: 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50  gured FCNTL_MMAP
1c90: 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23  _SIZE value */.#
1ca0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
1cb0: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
1cc0: 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46  or winFile.ctrlF
1cd0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
1ce0: 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20  WINFILE_RDONLY  
1cf0: 20 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f          0x02   /
1d00: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * Connection is 
1d10: 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  read only */.#de
1d20: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52  fine WINFILE_PER
1d30: 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30  SIST_WAL     0x0
1d40: 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e  4   /* Persisten
1d50: 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64  t WAL mode */.#d
1d60: 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53  efine WINFILE_PS
1d70: 4f 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78  OW            0x
1d80: 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  10   /* SQLITE_I
1d90: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1da0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a  VERWRITE */../*.
1db0: 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74   * The size of t
1dc0: 68 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62  he buffer used b
1dd0: 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  y sqlite3_win32_
1de0: 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20  write_debug().. 
1df0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e00: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
1e10: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
1e20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
1e30: 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74  BUF_SIZE   ((int
1e40: 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57  )(4096-sizeof(DW
1e50: 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  ORD))).#endif../
1e60: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
1e70: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1e80: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
1e90: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
1ea0: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61  y that. * the da
1eb0: 74 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ta directory sho
1ec0: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
1ed0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1ee0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
1ef0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
1f00: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1f10: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
1f20: 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64  RY_TYPE (1).#end
1f30: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61  if../*. * The va
1f40: 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71  lue used with sq
1f50: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1f60: 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73  directory() to s
1f70: 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74  pecify that. * t
1f80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
1f90: 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  ectory should be
1fa0: 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69   changed.. */.#i
1fb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1fc0: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
1fd0: 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65  Y_TYPE.#  define
1fe0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
1ff0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
2000: 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  E (2).#endif../*
2010: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
2020: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
2030: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
2040: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
2050: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
2060: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
2070: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
2080: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
2090: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
20a0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
20b0: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
20c0: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
20d0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
20e0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
20f0: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
2100: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
2110: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
2120: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
2130: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
2140: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
2150: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
2160: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
2170: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
2180: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
2190: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
21a0: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
21b0: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
21c0: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
21d0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
21e0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
21f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2230: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
2240: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
2250: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
2260: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
2270: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
2280: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
2290: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
22a0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22b0: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
22c0: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
22d0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
22e0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
22f0: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
2300: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
2310: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
2320: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
2330: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
2340: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
2350: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
2360: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
2370: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
2380: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
2390: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
23a0: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
23b0: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
23c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
2410: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2420: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
2430: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2440: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
2450: 45 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23  EATE    (TRUE).#
2460: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2470: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
2480: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
2490: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
24a0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
24b0: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
24c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
24d0: 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65  _INIT_SIZE.#  de
24e0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
24f0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
2500: 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   ((SQLITE_DEFAUL
2510: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20  T_CACHE_SIZE) * 
2520: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
2550: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2560: 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23  ZE) + 4194304).#
2570: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2580: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
2590: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
25a0: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
25b0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
25c0: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
25d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
25e0: 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66  _MAX_SIZE.#  def
25f0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2600: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20  _HEAP_MAX_SIZE  
2610: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (0).#endif../*. 
2620: 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67  * The extra flag
2630: 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c  s to use in call
2640: 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68  s to the Win32 h
2650: 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20  eap APIs.  This 
2660: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20  value may be. * 
2670: 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66  zero for the def
2680: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20  ault behavior.. 
2690: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
26a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
26b0: 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  GS.#  define SQL
26c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
26d0: 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e  LAGS     (0).#en
26e0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
26f0: 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63  winMemData struc
2700: 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f  ture stores info
2710: 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  rmation required
2720: 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70   by the Win32-sp
2730: 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65  ecific.** sqlite
2740: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d  3_mem_methods im
2750: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
2760: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2770: 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65  winMemData winMe
2780: 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69  mData;.struct wi
2790: 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64  nMemData {.#ifnd
27a0: 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20  ef NDEBUG.  u32 
27b0: 6d 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67  magic1;   /* Mag
27c0: 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74  ic number to det
27d0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ect structure co
27e0: 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e  rruption. */.#en
27f0: 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  dif.  HANDLE hHe
2800: 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c  ap; /* The handl
2810: 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a  e to our heap. *
2820: 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b  /.  BOOL bOwned;
2830: 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74    /* Do we own t
2840: 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65  he heap (i.e. de
2850: 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74  stroy it on shut
2860: 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65  down)? */.#ifnde
2870: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
2880: 61 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69  agic2;   /* Magi
2890: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
28a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
28b0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
28c0: 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  if.};..#ifndef N
28d0: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49  DEBUG.#define WI
28e0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20  NMEM_MAGIC1     
28f0: 30 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69  0x42b2830b.#defi
2900: 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  ne WINMEM_MAGIC2
2910: 20 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a       0xbd4d7cf4.
2920: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73  #endif..static s
2930: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
2940: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20   win_mem_data = 
2950: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
2960: 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  .  WINMEM_MAGIC1
2970: 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c  ,.#endif.  NULL,
2980: 20 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e   FALSE.#ifndef N
2990: 44 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f  DEBUG.  ,WINMEM_
29a0: 4d 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b  MAGIC2.#endif.};
29b0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
29c0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
29d0: 73 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73  ssertMagic1() as
29e0: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
29f0: 74 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  ta.magic1==WINME
2a00: 4d 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69  M_MAGIC1 ).#defi
2a10: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
2a20: 61 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20  agic2() assert( 
2a30: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67  win_mem_data.mag
2a40: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
2a50: 43 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e  C2 ).#define win
2a60: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
2a70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
2a80: 67 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73  gic1(); winMemAs
2a90: 73 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65  sertMagic2();.#e
2aa0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  lse.#define winM
2ab0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a  emAssertMagic().
2ac0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2ad0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
2ae0: 28 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74  ()  &win_mem_dat
2af0: 61 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  a.#define winMem
2b00: 47 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69  GetHeap()     wi
2b10: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70  n_mem_data.hHeap
2b20: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2b30: 65 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e  etOwned()    win
2b40: 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64  _mem_data.bOwned
2b50: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  ..static void *w
2b60: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
2b70: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
2b80: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
2b90: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73  void *pPrior);.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
2bb0: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
2bc0: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
2bd0: 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  es);.static int 
2be0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
2bf0: 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  *p);.static int 
2c00: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
2c10: 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t n);.static int
2c20: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
2c30: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61   *pAppData);.sta
2c40: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
2c50: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
2c60: 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20  ppData);..const 
2c70: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
2c80: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
2c90: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23  etWin32(void);.#
2ca0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2cb0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
2cc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2cd0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73  wing variable is
2ce0: 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20   (normally) set 
2cf0: 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63  once and never c
2d00: 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61  hanges.** therea
2d10: 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64  fter.  It record
2d20: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70  s whether the op
2d30: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2d40: 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69  s Win9x.** or Wi
2d50: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20  nNT..**.** 0:   
2d60: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
2d70: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20   unknown..** 1: 
2d80: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
2d90: 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20  em is Win9x..** 
2da0: 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  2:   Operating s
2db0: 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a  ystem is WinNT..
2dc0: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74  **.** In order t
2dd0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73  o facilitate tes
2de0: 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20  ting on a WinNT 
2df0: 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74  system, the test
2e00: 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20   fixture.** can 
2e10: 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69  manually set thi
2e20: 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20  s value to 1 to 
2e30: 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65  emulate Win98 be
2e40: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65  havior..*/.#ifde
2e50: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2e60: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2e70: 65 20 3d 20 30 3b 0a 23 65 6c 69 66 20 21 53 51  e = 0;.#elif !SQ
2e80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2e90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2ea0: 54 20 26 26 20 5c 0a 20 20 20 20 20 20 64 65 66  T && \.      def
2eb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2ec0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 64  2_HAS_ANSI) && d
2ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2ee0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 73 74  N32_HAS_WIDE).st
2ef0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
2f00: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
2f10: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59  ndif..#ifndef SY
2f20: 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20  SCALL.#  define 
2f30: 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f  SYSCALL sqlite3_
2f40: 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64  syscall_ptr.#end
2f50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
2f60: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
2f70: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
2f80: 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e  ows CE or WinRT.
2f90: 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  . */..#if SQLITE
2fa0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
2fb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20  ITE_OS_WINRT.#  
2fc0: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
2fd0: 41 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20  ApisANSI()      
2fe0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
2ff0: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
3000: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
3010: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
3020: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
3030: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
3040: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
3050: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
3060: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
3070: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
3080: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
3090: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
30a0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
30b0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
30c0: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
30d0: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
30e0: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
30f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
3100: 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a  t win_syscall {.
3110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3120: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3130: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
3140: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
3150: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3160: 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a  ptr pCurrent; /*
3170: 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   Current value o
3180: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
3190: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
31a0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61  yscall_ptr pDefa
31b0: 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20  ult; /* Default 
31c0: 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63  value */.} aSysc
31d0: 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53  all[] = {.#if !S
31e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
31f0: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
3200: 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  RT.  { "AreFileA
3210: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
3220: 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69    (SYSCALL)AreFi
3230: 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20  leApisANSI,     
3240: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3250: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
3260: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
3270: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
32a0: 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70  ndef osAreFileAp
32b0: 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f  isANSI.#define o
32c0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
32d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
32e0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
32f0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  0].pCurrent).#en
3300: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
3310: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
3320: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3330: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3340: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
3350: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3360: 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20  LL)CharLowerW,  
3370: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3380: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
3390: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
33a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
33d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
33e0: 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53  harLowerW ((LPWS
33f0: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
3400: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e  TR))aSyscall[1].
3410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
3420: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3430: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3440: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3450: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
3460: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
3470: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70  (SYSCALL)CharUpp
3480: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
3490: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
34a0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
34c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
34e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
34f0: 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20  ne osCharUpperW 
3500: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
3510: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
3520: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
3530: 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c  .  { "CloseHandl
3540: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
3550: 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61  (SYSCALL)CloseHa
3560: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
3570: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
3580: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28  osCloseHandle ((
3590: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
35a0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  NDLE))aSyscall[3
35b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
35c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
35d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
35e0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
35f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3600: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
3610: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  leA,            
3620: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3630: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3640: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3650: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3670: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3680: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20  e osCreateFileA 
3690: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
36a0: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44  )(LPCSTR,DWORD,D
36b0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
36c0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
36d0: 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52  BUTES,DWORD,DWOR
36e0: 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  D,HANDLE))aSysca
36f0: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
3700: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3710: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3720: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3730: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
3740: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
3750: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3760: 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20  CreateFileW,    
3770: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3780: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3790: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
37a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
37d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
37e0: 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45  teFileW ((HANDLE
37f0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
3800: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
3810: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
3820: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
3830: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
3840: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  E))aSyscall[5].p
3850: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21  Current)..#if (!
3860: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3870: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3880: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3890: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21  ) && \.        !
38a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
38b0: 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43  MIT_WAL)).  { "C
38c0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
38d0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
38e0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
38f0: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
3900: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3910: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
3920: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3940: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3950: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3960: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
3970: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3980: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55  *)(HANDLE,LPSECU
3990: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
39a0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
39b0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43  ,DWORD,DWORD,LPC
39c0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  STR))aSyscall[6]
39d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
39e0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
39f0: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
3a00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3a10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3a20: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
3a30: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
3a40: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
3a50: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3a60: 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  ppingW",      (S
3a70: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
3a80: 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20  eMappingW,      
3a90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3aa0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3ab0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
3ac0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ae0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3af0: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
3b00: 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57  pingW ((HANDLE(W
3b10: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
3b20: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
3b30: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
3b40: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
3b50: 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  D,LPCWSTR))aSysc
3b60: 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29  all[7].pCurrent)
3b70: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3b80: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3b90: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3ba0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72  AS_WIDE).  { "Cr
3bb0: 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20  eateMutexW",    
3bc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3bd0: 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20  )CreateMutexW,  
3be0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3bf0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3c00: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
3c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3c40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3c50: 61 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44  ateMutexW ((HAND
3c60: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
3c70: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3c80: 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20  S,BOOL, \.      
3c90: 20 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63    LPCWSTR))aSysc
3ca0: 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29  all[8].pCurrent)
3cb0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3cd0: 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65  NSI).  { "Delete
3ce0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c      (SYSCALL)Del
3d00: 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  eteFileA,       
3d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3d20: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
3d30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
3d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3d70: 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46  define osDeleteF
3d80: 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ileA ((BOOL(WINA
3d90: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
3da0: 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e  scall[9].pCurren
3db0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3dc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3dd0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65  _WIDE).  { "Dele
3de0: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
3df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
3e00: 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20  eleteFileW,     
3e10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3e20: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
3e30: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
3e40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3e70: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
3e80: 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49  eFileW ((BOOL(WI
3e90: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
3ea0: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75  aSyscall[10].pCu
3eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
3ec0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
3ed0: 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  "FileTimeToLocal
3ee0: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43  FileTime", (SYSC
3ef0: 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  ALL)FileTimeToLo
3f00: 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d  calFileTime, 0 }
3f10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c  ,.#else.  { "Fil
3f20: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
3f30: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3f60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3f70: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
3f80: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
3f90: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49  INAPI*)(CONST FI
3fa0: 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20  LETIME*, \.     
3fb0: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
3fc0: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
3fd0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3fe0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
3ff0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
4000: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
4010: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  LL)FileTimeToSys
4020: 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  temTime,    0 },
4030: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
4040: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4050: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
4060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4070: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4080: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4090: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
40a0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
40b0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
40c0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
40d0: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
40e0: 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65  scall[12].pCurre
40f0: 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46  nt)..  { "FlushF
4100: 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20  ileBuffers",    
4110: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75      (SYSCALL)Flu
4120: 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20  shFileBuffers,  
4130: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4140: 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  ine osFlushFileB
4150: 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49  uffers ((BOOL(WI
4160: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
4170: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
4180: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4190: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
41a0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46  HAS_ANSI).  { "F
41b0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20  ormatMessageA", 
41c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
41d0: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  L)FormatMessageA
41e0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
41f0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
4200: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
4210: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4240: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
4250: 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44  rmatMessageA ((D
4260: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
4270: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
4280: 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c  D,DWORD,LPSTR, \
4290: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76  .        DWORD,v
42a0: 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c  a_list*))aSyscal
42b0: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
42c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
42d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
42e0: 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  DE).  { "FormatM
42f0: 65 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20  essageW",       
4300: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
4310: 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20  atMessageW,     
4320: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4330: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4340: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
4350: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4380: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
4390: 73 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57  ssageW ((DWORD(W
43a0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
43b0: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
43c0: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
43d0: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
43e0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  t*))aSyscall[15]
43f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4400: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4410: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
4420: 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69  ION).  { "FreeLi
4430: 62 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20  brary",         
4440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65      (SYSCALL)Fre
4450: 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20  eLibrary,       
4460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4470: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
4480: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
4490: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
44c0: 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62  define osFreeLib
44d0: 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  rary ((BOOL(WINA
44e0: 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53  PI*)(HMODULE))aS
44f0: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
4500: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75  ent)..  { "GetCu
4510: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c  rrentProcessId",
4520: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4530: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
4540: 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  d,     0 },..#de
4550: 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e  fine osGetCurren
4560: 74 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f  tProcessId ((DWO
4570: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
4580: 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70  ))aSyscall[17].p
4590: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
45a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
45b0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
45c0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
45d0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
45e0: 65 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20  eSpaceA",       
45f0: 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b  (SYSCALL)GetDisk
4600: 46 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20  FreeSpaceA,     
4610: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4620: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
4630: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
4640: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4660: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4670: 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65  ne osGetDiskFree
4680: 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49  SpaceA ((BOOL(WI
4690: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50  NAPI*)(LPCSTR,LP
46a0: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50  DWORD,LPDWORD,LP
46b0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
46c0: 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61   LPDWORD))aSysca
46d0: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[18].pCurrent)
46e0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
46f0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
4700: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4710: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4720: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4730: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
4740: 63 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceW",       (SYS
4750: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
4760: 53 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20  SpaceW,       0 
4770: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4780: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
4790: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
47a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
47b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
47c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
47d0: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
47e0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
47f0: 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f  *)(LPCWSTR,LPDWO
4800: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
4810: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4820: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4830: 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  19].pCurrent)..#
4840: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4850: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4860: 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  ).  { "GetFileAt
4870: 74 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20  tributesA",     
4880: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
4890: 65 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20  eAttributesA,   
48a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
48b0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
48c0: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
48d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
48f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4900: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74  ine osGetFileAtt
4910: 72 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44  ributesA ((DWORD
4920: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4930: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
4940: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4960: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4970: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4980: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4990: 72 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20  ributesW",      
49a0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
49b0: 41 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20  AttributesW,    
49c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
49d0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
49e0: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
49f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4a10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4a20: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
4a30: 69 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28  ibutesW ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4a50: 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70  ))aSyscall[21].p
4a60: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4a70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4a80: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4a90: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
4aa0: 74 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53  tesExW",    (SYS
4ab0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
4ac0: 69 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20  ibutesExW,    0 
4ad0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4ae0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4af0: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
4b00: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4b10: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4b20: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4b30: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
4b40: 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e  esExW ((BOOL(WIN
4b50: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45  API*)(LPCWSTR,GE
4b60: 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45  T_FILEEX_INFO_LE
4b70: 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  VELS, \.        
4b80: 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  LPVOID))aSyscall
4b90: 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [22].pCurrent)..
4ba0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4bb0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c  INRT.  { "GetFil
4bc0: 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  eSize",         
4bd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4be0: 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
4bf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4c00: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
4c10: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4c20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4c50: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
4c60: 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e  Size ((DWORD(WIN
4c70: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44  API*)(HANDLE,LPD
4c80: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  WORD))aSyscall[2
4c90: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
4ca0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4cb0: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
4cd0: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c  NSI).  { "GetFul
4ce0: 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20  lPathNameA",    
4cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4d00: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20  FullPathNameA,  
4d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4d20: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
4d30: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
4d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4d70: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c  define osGetFull
4d80: 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52  PathNameA ((DWOR
4d90: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
4da0: 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c  R,DWORD,LPSTR, \
4db0: 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29  .        LPSTR*)
4dc0: 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43  )aSyscall[24].pC
4dd0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4de0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
4df0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4e00: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
4e10: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4e20: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  DE).  { "GetFull
4e30: 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20  PathNameW",     
4e40: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
4e50: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20  ullPathNameW,   
4e60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4e70: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
4e80: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
4e90: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4ec0: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
4ed0: 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44  athNameW ((DWORD
4ee0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
4ef0: 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  R,DWORD,LPWSTR, 
4f00: 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52  \.        LPWSTR
4f10: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e  *))aSyscall[25].
4f20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4f30: 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20  GetLastError",  
4f40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f50: 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  LL)GetLastError,
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f70: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c  ..#define osGetL
4f80: 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44  astError ((DWORD
4f90: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
4fa0: 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75  aSyscall[26].pCu
4fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4fd0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
4fe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4ff0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65  INCE.  /* The Ge
5000: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20  tProcAddressA() 
5010: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
5020: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e  available on Win
5030: 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20  dows CE. */.  { 
5040: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
5050: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
5060: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
5070: 73 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ssA,         0 }
5080: 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ,.#else.  /* All
5090: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70   other Windows p
50a0: 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
50b0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
50c0: 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
50d0: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67   ANSI string reg
50e0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
50f0: 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
5100: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
5110: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5120: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
5130: 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20  ocAddress,      
5140: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5150: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72  #else.  { "GetPr
5160: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
5170: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
51a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
51b0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28  tProcAddressA ((
51c0: 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29  FARPROC(WINAPI*)
51d0: 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20  (HMODULE, \.    
51e0: 20 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73      LPCSTR))aSys
51f0: 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e  call[27].pCurren
5200: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5210: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
5220: 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  tSystemInfo",   
5230: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5240: 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20  )GetSystemInfo, 
5250: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5260: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
5270: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
5280: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
52b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
52c0: 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49  SystemInfo ((VOI
52d0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
52e0: 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61  TEM_INFO))aSysca
52f0: 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[28].pCurrent)
5300: 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  ..  { "GetSystem
5310: 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20  Time",          
5320: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
5330: 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20  temTime,        
5340: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5350: 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
5360: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
5370: 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61  (LPSYSTEMTIME))a
5380: 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72  Syscall[29].pCur
5390: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
53a0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
53b0: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  "GetSystemTimeAs
53c0: 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43  FileTime", (SYSC
53d0: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
53e0: 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d  eAsFileTime, 0 }
53f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5400: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5410: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
5420: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5440: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5450: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5460: 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57  ileTime ((VOID(W
5470: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
5480: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61     LPFILETIME))a
5490: 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72  Syscall[30].pCur
54a0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
54b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
54c0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
54d0: 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20  etTempPathA",   
54e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
54f0: 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20  L)GetTempPathA, 
5500: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5510: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65  #else.  { "GetTe
5520: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
5530: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5560: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5570: 74 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f  tTempPathA ((DWO
5580: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
5590: 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c  D,LPSTR))aSyscal
55a0: 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[31].pCurrent).
55b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
55c0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
55d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
55e0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
55f0: 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20  TempPathW",     
5600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5610: 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20  GetTempPathW,   
5620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5630: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  lse.  { "GetTemp
5640: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
5650: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5680: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
5690: 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44  empPathW ((DWORD
56a0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
56b0: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
56c0: 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [32].pCurrent)..
56d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
56e0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63  INRT.  { "GetTic
56f0: 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  kCount",        
5700: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5710: 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20  TickCount,      
5720: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5730: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
5740: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
5750: 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5780: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b  define osGetTick
5790: 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49  Count ((DWORD(WI
57a0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
57b0: 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65  scall[33].pCurre
57c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
57d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
57e0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
57f0: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20  VersionExA",    
5800: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5810: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20  GetVersionExA,  
5820: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5830: 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73  lse.  { "GetVers
5840: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
5850: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5880: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56  ..#define osGetV
5890: 65 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c  ersionExA ((BOOL
58a0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
58b0: 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e       LPOSVERSION
58c0: 49 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b  INFOA))aSyscall[
58d0: 33 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  34].pCurrent)..#
58e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
58f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
5900: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5910: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 56 65  WIDE).  { "GetVe
5920: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
5930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5940: 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20  tVersionExW,    
5950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5960: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
5970: 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  nExW",          
5980: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
59b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
59c0: 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57  sionExW ((BOOL(W
59d0: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
59e0: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
59f0: 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  FOW))aSyscall[35
5a00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5a10: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5a30: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5a50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5a60: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
5a70: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5a80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5a90: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5aa0: 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[36].pCurrent)
5ab0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5ac0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
5ad0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
5ae0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5af0: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
5b00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5b10: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
5b20: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5b30: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5b60: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
5b70: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
5b80: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
5b90: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
5ba0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
5bb0: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
5bc0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5bd0: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
5be0: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
5bf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5c00: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
5c10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5c20: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
5c30: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
5c40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5c70: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
5c80: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
5c90: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
5ca0: 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65  scall[38].pCurre
5cb0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
5cc0: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
5cd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5ce0: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
5cf0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5d00: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
5d10: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
5d20: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
5d30: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d  ID))aSyscall[39]
5d40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5d50: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
5d60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5d70: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5d90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
5da0: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
5db0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
5dc0: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
5dd0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
5de0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
5df0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
5e00: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
5e10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5e20: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
5e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5e40: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
5e50: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
5e60: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5e70: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5e80: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
5e90: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
5ea0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5eb0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
5ec0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
5ed0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5ee0: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
5ef0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5f00: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
5f10: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
5f20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5f50: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
5f60: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
5f70: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
5f80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
5f90: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
5fa0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5fb0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5fc0: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70  RT.  { "HeapComp
5fd0: 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  act",           
5fe0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
5ff0: 6f 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20  ompact,         
6000: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6010: 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22   { "HeapCompact"
6020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6030: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6060: 66 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61  fine osHeapCompa
6070: 63 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49  ct ((UINT(WINAPI
6080: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29  *)(HANDLE,DWORD)
6090: 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43  )aSyscall[43].pC
60a0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
60b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
60c0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21  2_HAS_ANSI) && !
60d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
60e0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
60f0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
6100: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
6110: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
6120: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
6130: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6140: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
6150: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
6160: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6190: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
61a0: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
61b0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
61c0: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75  aSyscall[44].pCu
61d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
61e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
61f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6200: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
6210: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
6220: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6230: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
6240: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
6250: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
6260: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
6270: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
6280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6290: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
62b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
62d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
62e0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
62f0: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
6300: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
6310: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
6320: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6330: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6340: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
6350: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6360: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
6370: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6380: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
6390: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
63a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
63b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
63c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
63d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
63e0: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
63f0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
6400: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  L))aSyscall[46].
6410: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6420: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6430: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
6440: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
6450: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6460: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
6470: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6480: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6490: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
64b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
64e0: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
64f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
6500: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6510: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6520: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6530: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
6540: 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72  Syscall[47].pCur
6550: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
6560: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6570: 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  CE.  { "LockFile
6580: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
6590: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
65a0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
65b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
65c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
65e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
6610: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  ndef osLockFileE
6620: 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  x.#define osLock
6630: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
6640: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6650: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6660: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6670: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
6680: 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72  Syscall[48].pCur
6690: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
66a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
66b0: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
66c0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
66d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
66e0: 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  AL)).  { "MapVie
66f0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
6700: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
6710: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
6720: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6730: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6740: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6750: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6780: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
6790: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
67a0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
67b0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
67c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
67d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  E_T))aSyscall[49
67e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
67f0: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
6800: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
6810: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
6820: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
6830: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
6840: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
6850: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
6860: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
6870: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
6880: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
6890: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
68a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
68b0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
68c0: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
68d0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
68e0: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
68f0: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
6900: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
6910: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
6920: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
6930: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
6940: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
6950: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
6960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6970: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
6980: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
6990: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
69a0: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
69b0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
69c0: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
69d0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
69e0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
69f0: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
6a00: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
6a10: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
6a20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6a30: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
6a40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6a50: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
6a60: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
6a70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
6a80: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
6a90: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6aa0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6ab0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
6ac0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
6ad0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6ae0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
6af0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6b00: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
6b10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6b20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6b30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b40: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6b50: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28  SetFilePointer (
6b60: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6b70: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e  HANDLE,LONG,PLON
6b80: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  G, \.        DWO
6b90: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  RD))aSyscall[54]
6ba0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6bb0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6bc0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6c10: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6c30: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6c50: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6c60: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
6c70: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
6c80: 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70  ))aSyscall[55].p
6c90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
6ca0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
6cb0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
6cc0: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
6cd0: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
6ce0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
6cf0: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
6d00: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6d10: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
6d20: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
6d30: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
6d40: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[56].pCurrent).
6d50: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6d60: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
6d70: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55  _OS_WINRT.  { "U
6d80: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
6d90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6da0: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
6db0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6dc0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
6dd0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6de0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6e10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e  if..#ifndef osUn
6e20: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  lockFile.#define
6e30: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
6e40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6e50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6e60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6e70: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6e80: 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[57].pCurrent).
6e90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
6ea0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
6eb0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6ed0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
6ee0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
6ef0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
6f00: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
6f10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6f20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6f30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6f40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6f50: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
6f60: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f70: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6f80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6f90: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
6fa0: 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75  aSyscall[58].pCu
6fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
6fc0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21  TE_OS_WINCE || !
6fd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6fe0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e  MIT_WAL).  { "Un
6ff0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
7000: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7010: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  )UnmapViewOfFile
7020: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
7030: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56  else.  { "UnmapV
7040: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
7050: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7080: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d  f..#define osUnm
7090: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42  apViewOfFile ((B
70a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
70b0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  VOID))aSyscall[5
70c0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
70d0: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  { "WideCharToMul
70e0: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59  tiByte",     (SY
70f0: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f  SCALL)WideCharTo
7100: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30  MultiByte,     0
7110: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
7120: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
7130: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  te ((int(WINAPI*
7140: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
7150: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69  WSTR,int,LPSTR,i
7160: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  nt, \.        LP
7170: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79  CSTR,LPBOOL))aSy
7180: 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65  scall[60].pCurre
7190: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46  nt)..  { "WriteF
71a0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
71b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69      (SYSCALL)Wri
71c0: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  teFile,         
71d0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
71e0: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20  ine osWriteFile 
71f0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7200: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44  HANDLE,LPCVOID,D
7210: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
7220: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7230: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  PPED))aSyscall[6
7240: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
7250: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7260: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  T.  { "CreateEve
7270: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
7280: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
7290: 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20  EventExW,       
72a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
72b0: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78  { "CreateEventEx
72c0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
72d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
72f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7300: 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e  ine osCreateEven
7310: 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  tExW ((HANDLE(WI
7320: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
7330: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43  Y_ATTRIBUTES,LPC
7340: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
7350: 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79  DWORD,DWORD))aSy
7360: 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65  scall[62].pCurre
7370: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7380: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
7390: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
73a0: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
73b0: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
73c0: 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a  bject,     0 },.
73d0: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
73e0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c  orSingleObject",
73f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7420: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
7430: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7440: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
7450: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
7460: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
7470: 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e  call[63].pCurren
7480: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7490: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
74a0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
74b0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
74c0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
74d0: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
74e0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
74f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
7500: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7530: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
7540: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
7550: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
7560: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7570: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
7580: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
7590: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
75a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
75b0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
75c0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
75d0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
75e0: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
75f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
7600: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7610: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7620: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7630: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7640: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7650: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
7660: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7670: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
7680: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
7690: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
76a0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
76b0: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
76c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
76d0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
76e0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
76f0: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
7700: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
7710: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
7720: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
7730: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
7740: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
7750: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7760: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7770: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7780: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
7790: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
77a0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
77b0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
77c0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
77d0: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
77e0: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
77f0: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
7800: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7810: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
7820: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
7830: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7840: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
7850: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7860: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20  wOfFileFromApp, 
7870: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7880: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7890: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
78a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
78c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
78d0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
78e0: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56  ileFromApp ((LPV
78f0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7900: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  DLE,ULONG,ULONG6
7910: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  4, \.        SIZ
7920: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 37  E_T))aSyscall[67
7930: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7940: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7950: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
7960: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
7970: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7980: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20  ile2,           
7990: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
79a0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
79c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
79e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
79f0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32  ne osCreateFile2
7a00: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7a10: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
7a20: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
7a30: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45          LPCREATE
7a40: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
7a50: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63  ARAMETERS))aSysc
7a60: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
7a70: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7a80: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
7a90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
7aa0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
7ab0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
7ac0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
7ad0: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61  YSCALL)LoadPacka
7ae0: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20  gedLibrary,     
7af0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7b00: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
7b10: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
7b20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7b40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7b50: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
7b60: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
7b70: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7b80: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
7b90: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d  RD))aSyscall[69]
7ba0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7bb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7bc0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
7bd0: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
7be0: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
7bf0: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20  ount64,         
7c00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7c10: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
7c20: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7c30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7c50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7c60: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
7c70: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57  64 ((ULONGLONG(W
7c80: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
7c90: 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72  yscall[70].pCurr
7ca0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7cb0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
7cc0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
7cd0: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
7ce0: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  L)GetNativeSyste
7cf0: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a  mInfo,     0 },.
7d00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61  #else.  { "GetNa
7d10: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
7d20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7d50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
7d60: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
7d70: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
7d80: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  )( \.        LPS
7d90: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
7da0: 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65 6e  call[71].pCurren
7db0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
7dc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7dd0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70  _ANSI).  { "Outp
7de0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
7df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
7e00: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7e10: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
7e20: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
7e30: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
7e40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7e70: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
7e80: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28  tDebugStringA ((
7e90: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
7ea0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  CSTR))aSyscall[7
7eb0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
7ec0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7ed0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
7ee0: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7ef0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
7f00: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
7f10: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20  ebugStringW,    
7f20: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7f30: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
7f40: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
7f50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7f70: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7f80: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
7f90: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57  StringW ((VOID(W
7fa0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
7fb0: 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43  )aSyscall[73].pC
7fc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
7fd0: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20  tProcessHeap",  
7fe0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7ff0: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c  )GetProcessHeap,
8000: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
8010: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
8020: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c  cessHeap ((HANDL
8030: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  E(WINAPI*)(VOID)
8040: 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70 43  )aSyscall[74].pC
8050: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8060: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8070: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8080: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43  OMIT_WAL).  { "C
8090: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
80a0: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
80b0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
80c0: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
80d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
80e0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
80f0: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8100: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8110: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8120: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8130: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8140: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
8150: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
8160: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
8170: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
8180: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
8190: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
81a0: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
81b0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
81c0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
81d0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
81e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
81f0: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
8200: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
8210: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
8220: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e  l of the.** "win
8230: 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  32" VFSes.  Retu
8240: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
8250: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
8260: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
8270: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
8280: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
8290: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
82a0: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
82b0: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
82c0: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
82d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
82e0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
82f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
8300: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f  otUsed,        /
8310: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65  * The VFS pointe
8320: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a  r.  Not used */.
8330: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8340: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
8350: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65  /* Name of syste
8360: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69  m call to overri
8370: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
8380: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77  syscall_ptr pNew
8390: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Func  /* Pointer
83a0: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63   to new system c
83b0: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  all value */.){.
83c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
83d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
83e0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20  ITE_NOTFOUND;.. 
83f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8400: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  R(pNotUsed);.  i
8410: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
8420: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d     /* If no zNam
8430: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74  e is given, rest
8440: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63  ore all system c
8450: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65  alls to their de
8460: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  fault.    ** set
8470: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e  tings and return
8480: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20   NULL.    */.   
8490: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
84a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84b0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
84c0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
84d0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
84e0: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
84f0: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
8500: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
8510: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
8520: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8530: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
8540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
8550: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65   If zName is spe
8560: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20  cified, operate 
8570: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20  on only the one 
8580: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20  system call.    
8590: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ** specified..  
85a0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
85b0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
85c0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
85d0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
85e0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
85f0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8600: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
8610: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79  .        if( aSy
8620: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8630: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
8640: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44    aSyscall[i].pD
8650: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c  efault = aSyscal
8660: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
8670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8680: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
86a0: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46  wFunc==0 ) pNewF
86b0: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  unc = aSyscall[i
86c0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
86d0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
86e0: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46  pCurrent = pNewF
86f0: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  unc;.        bre
8700: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8710: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8720: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
8730: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
8740: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  a system call.  
8750: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
8760: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  Name is not a.**
8770: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74   recognized syst
8780: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e  em call name.  N
8790: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ULL is also retu
87a0: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74  rned if the syst
87b0: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75  em call.** is cu
87c0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65  rrently undefine
87d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  d..*/.static sql
87e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
87f0: 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
8800: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
8810: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
8820: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
8830: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
8840: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
8850: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
8860: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
8870: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
8880: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
8890: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
88a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
88b0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
88c0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
88d0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
88e0: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
88f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8900: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
8910: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
8920: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
8930: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
8940: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
8950: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
8960: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
8970: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
8980: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
8990: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
89a0: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
89b0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
89c0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
89d0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
89e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
89f0: 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79   char *winNextSy
8a00: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
8a10: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
8a20: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
8a30: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
8a40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8a50: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
8a60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8a70: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
8a80: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
8a90: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
8aa0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
8ab0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
8ac0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8ad0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
8ae0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
8b00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8b10: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
8b20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
8b30: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
8b40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  0;.}../*.** If a
8b50: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
8b60: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
8b70: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
8b80: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
8b90: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
8ba0: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
8bb0: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
8bc0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
8bd0: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
8be0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
8bf0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
8c00: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
8c10: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
8c20: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
8c30: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
8c40: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
8c50: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
8c60: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
8c70: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
8c80: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
8c90: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
8ca0: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
8cb0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8cc0: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
8cd0: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
8ce0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
8cf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8d00: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
8d10: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
8d20: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
8d30: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
8d40: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
8d50: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
8d60: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8d70: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
8d80: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8d90: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
8da0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
8db0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8dc0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
8dd0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
8de0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
8df0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8e00: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
8e10: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
8e20: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
8e30: 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73 74  .  if( (nLargest
8e40: 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28 68  =osHeapCompact(h
8e50: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8e60: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29 3d  32_HEAP_FLAGS))=
8e70: 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  =0 ){.    DWORD 
8e80: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
8e90: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
8ea0: 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
8eb0: 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  =NO_ERROR ){.   
8ec0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
8ed0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
8ee0: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70  iled to HeapComp
8ef0: 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c 20  act (no space), 
8f00: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
8f20: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
8f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
8f40: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
8f50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
8f60: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22  (SQLITE_ERROR, "
8f70: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
8f80: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61  mpact (%lu), hea
8f90: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
8fa0: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
8fb0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
8fc0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
8fd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8fe0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
8ff0: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  se.  sqlite3_log
9000: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  (SQLITE_NOTFOUND
9010: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9020: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25  pCompact, heap=%
9030: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9040: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
9050: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
9060: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a  OTFOUND;.#endif.
9070: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20    if( pnLargest 
9080: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e  ) *pnLargest = n
9090: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72  Largest;.  retur
90a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
90b0: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
90c0: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
90d0: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
90e0: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
90f0: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74  tempt to.** dest
9100: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
9110: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e   it.  If the Win
9120: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69  32 native heap i
9130: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61  s not isolated a
9140: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c  nd/or.** the sql
9150: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9160: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
9170: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f   not return zero
9180: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69  , SQLITE_BUSY wi
9190: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
91a0: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73  d and no changes
91b0: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
91c0: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   the Win32 nativ
91d0: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73  e heap..*/.int s
91e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73  qlite3_win32_res
91f0: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74  et_heap(){.  int
9200: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47   rc;.  MUTEX_LOG
9210: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
9220: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a  x *pMaster; ) /*
9230: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
9240: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
9250: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9260: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20  _mutex *pMem; ) 
9270: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73     /* The memsys
9280: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
9290: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
92a0: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
92b0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
92c0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
92d0: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54  MASTER); ).  MUT
92e0: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d  EX_LOGIC( pMem =
92f0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9300: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9310: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
9320: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9330: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
9340: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9350: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 69 66  nter(pMem);.  if
9360: 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  ( winMemGetOwned
9370: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
9380: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
9390: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
93a0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
93b0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
93c0: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
93d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
93e0: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
93f0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
9400: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
9410: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
9420: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
9430: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
9440: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
9450: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
9460: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
9470: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
9480: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
9490: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
94a0: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
94b0: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
94c0: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
94d0: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
94e0: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
94f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 69 6e  ..    */.    win
9500: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d  MemShutdown(winM
9510: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b  emGetDataPtr());
9520: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 28  .    winMemInit(
9530: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
9540: 28 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ());.    rc = SQ
9550: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
9560: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9570: 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  The Win32 native
9580: 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65 20   heap cannot be 
9590: 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73 65  modified because
95a0: 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75 73   it may be in us
95b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
95c0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
95d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
95e0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b  tex_leave(pMem);
95f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9600: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
9610: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9630: 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65  tion outputs the
9640: 20 73 70 65 63 69 66 69 65 64 20 28 41 4e 53 49   specified (ANSI
9650: 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  ) string to the 
9660: 57 69 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a  Win32 debugger.*
9670: 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29  * (if available)
9680: 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/..void sqlit
9690: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
96a0: 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20  ebug(const char 
96b0: 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29  *zBuf, int nBuf)
96c0: 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42 75 66  {.  char zDbgBuf
96d0: 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  [SQLITE_WIN32_DB
96e0: 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69  G_BUF_SIZE];.  i
96f0: 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42  nt nMin = MIN(nB
9700: 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33  uf, (SQLITE_WIN3
9710: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d  2_DBG_BUF_SIZE -
9720: 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20   1)); /* may be 
9730: 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69  negative. */.  i
9740: 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69  f( nMin<-1 ) nMi
9750: 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e  n = -1; /* all n
9760: 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 62  egative values b
9770: 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61  ecome -1. */.  a
9780: 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20  ssert( nMin==-1 
9790: 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d  || nMin==0 || nM
97a0: 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  in<SQLITE_WIN32_
97b0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a  DBG_BUF_SIZE );.
97c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
97d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
97e0: 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  I).  if( nMin>0 
97f0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
9800: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
9810: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
9820: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
9830: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
9840: 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74  nMin);.    osOut
9850: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
9860: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
9870: 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  e{.    osOutputD
9880: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66  ebugStringA(zBuf
9890: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  );.  }.#elif def
98a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
98b0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65  2_HAS_WIDE).  me
98c0: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
98d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
98e0: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69  G_BUF_SIZE);.  i
98f0: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  f ( osMultiByteT
9900: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20  oWideChar(.     
9910: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70       osAreFileAp
9920: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
9930: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c  P : CP_OEMCP, 0,
9940: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
9950: 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a   nMin, (LPWSTR)z
9960: 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57  DbgBuf, SQLITE_W
9970: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
9980: 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29  E/sizeof(WCHAR))
9990: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
99a0: 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75  n;.  }.  osOutpu
99b0: 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c  tDebugStringW((L
99c0: 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b  PCWSTR)zDbgBuf);
99d0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69  .#else.  if( nMi
99e0: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
99f0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
9a00: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
9a10: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
9a20: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
9a30: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66  uf, nMin);.    f
9a40: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
9a50: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20  %s", zDbgBuf);. 
9a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
9a70: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
9a80: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
9a90: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
9aa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9ab0: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20  ne suspends the 
9ac0: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66  current thread f
9ad0: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a  or at least ms.*
9ae0: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20  * milliseconds. 
9af0: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
9b00: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ent to the Win32
9b10: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61   Sleep() interfa
9b20: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ce..*/.#if SQLIT
9b30: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69  E_OS_WINRT.stati
9b40: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62  c HANDLE sleepOb
9b50: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  j = NULL;.#endif
9b60: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
9b70: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44  in32_sleep(DWORD
9b80: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a   milliseconds){.
9b90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
9ba0: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70  NRT.  if ( sleep
9bb0: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj==NULL ){.   
9bc0: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
9bd0: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c  eateEventExW(NUL
9be0: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f  L, NULL, CREATE_
9bf0: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53  EVENT_MANUAL_RES
9c00: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ET,.            
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29      SYNCHRONIZE)
9c30: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9c40: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
9c50: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ;.  osWaitForSin
9c60: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65  gleObjectEx(slee
9c70: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e  pObj, millisecon
9c80: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73  ds, FALSE);.#els
9c90: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c  e.  osSleep(mill
9ca0: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69  iseconds);.#endi
9cb0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
9cc0: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
9cd0: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
9ce0: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
9cf0: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
9d00: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
9d10: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
9d20: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
9d30: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
9d40: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
9d50: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
9d60: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
9d70: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
9d80: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
9d90: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
9da0: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
9db0: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
9dc0: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
9dd0: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
9de0: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
9df0: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e  when running Win
9e00: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
9e10: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
9e20: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
9e30: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
9e40: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
9e50: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
9e60: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
9e70: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
9e80: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
9e90: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
9ea0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
9eb0: 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ) API..*/.#ifnde
9ec0: 66 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20  f NTDDI_WIN8.#  
9ed0: 64 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e  define NTDDI_WIN
9ee0: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
9ef0: 20 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30           0x06020
9f00: 30 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  000.#endif..#if 
9f10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
9f20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
9f30: 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  RT || !defined(S
9f40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
9f50: 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f  ANSI).# define o
9f60: 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c  sIsNT()  (1).#el
9f70: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9f80: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
9f90: 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  E).# define osIs
9fa0: 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a  NT()  (0).#else.
9fb0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f 73 49    static int osI
9fc0: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
9fd0: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
9fe0: 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  pe==0 ){.#if def
9ff0: 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49  ined(NTDDI_VERSI
a000: 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52  ON) && NTDDI_VER
a010: 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49  SION >= NTDDI_WI
a020: 4e 38 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  N8.      OSVERSI
a030: 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20  ONINFOW sInfo;. 
a040: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
a050: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
a060: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
a070: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
a080: 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a 23  onExW(&sInfo);.#
a090: 65 6c 73 65 0a 20 20 20 20 20 20 4f 53 56 45 52  else.      OSVER
a0a0: 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b  SIONINFOA sInfo;
a0b0: 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  .      sInfo.dwO
a0c0: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
a0d0: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
a0e0: 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72  ;.      osGetVer
a0f0: 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b  sionExA(&sInfo);
a100: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71  .#endif.      sq
a110: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
a120: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
a130: 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d  Id==VER_PLATFORM
a140: 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20  _WIN32_NT ? 2 : 
a150: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
a160: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  urn sqlite3_os_t
a170: 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64  ype==2;.  }.#end
a180: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
a190: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f  E_WIN32_MALLOC./
a1a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
a1b0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
a1c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
a1d0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
a1e0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
a1f0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
a200: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
a210: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
a220: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
a230: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
a240: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
a250: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
a260: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
a270: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
a280: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
a290: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
a2a0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
a2b0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
a2c0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
a2d0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
a2e0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
a2f0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
a300: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
a310: 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61  0 );.  p = osHea
a320: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
a330: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
a340: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
a350: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70  Bytes);.  if( !p
a360: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a370: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
a380: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
a390: 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20  pAlloc %u bytes 
a3a0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a3c0: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
a3d0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
a3e0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
a3f0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
a400: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
a410: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
a420: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
a430: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
a440: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
a450: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
a460: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
a470: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
a480: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
a490: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
a4a0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
a4b0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
a4c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
a4d0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
a4e0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
a4f0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
a500: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
a510: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
a520: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
a530: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
a540: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
a550: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
a560: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
a570: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
a580: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
a590: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
a5a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
a5b0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
a5c0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
a5d0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
a5e0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
a5f0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
a600: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
a610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a620: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
a630: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
a640: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
a650: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
a660: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
a670: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
a680: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
a690: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
a6a0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
a6b0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
a6c0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
a6d0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
a6e0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
a6f0: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
a700: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
a710: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
a720: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a730: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
a740: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
a750: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
a760: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
a770: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a780: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
a790: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
a7a0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
a7b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
a7c0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
a7d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
a7e0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
a7f0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
a800: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
a810: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
a820: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a830: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
a840: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
a850: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
a860: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
a870: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a880: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
a890: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
a8a0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
a8b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
a8c0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
a8d0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
a8e0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
a8f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a900: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
a910: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
a920: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
a930: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
a940: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
a950: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
a960: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a980: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
a990: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
a9a0: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
a9b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
a9c0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
a9d0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
a9e0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
a9f0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
aa00: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
aa10: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
aa20: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
aa30: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
aa40: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
aa50: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
aa60: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
aa70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
aa80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
aa90: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
aaa0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
aab0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
aac0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
aad0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
aae0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
aaf0: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
ab00: 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65    n = osHeapSize
ab10: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
ab20: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ab30: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
ab40: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
ab50: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
ab60: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
ab70: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
ab80: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
ab90: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
aba0: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
abb0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
abc0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
abd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
abe0: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
abf0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
ac00: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
ac10: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
ac20: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
ac30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ac40: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
ac50: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
ac60: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
ac70: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
ac80: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ac90: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
aca0: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
acb0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
acc0: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
acd0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
ace0: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
acf0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
ad00: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
ad10: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
ad20: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
ad30: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
ad40: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
ad50: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
ad60: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69  EM_MAGIC2 );..#i
ad70: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
ad80: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
ad90: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20  32_HEAP_CREATE. 
ada0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
adb0: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
adc0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
add0: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
ade0: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
adf0: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
ae30: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20  AP_INIT_SIZE,.  
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
ae70: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b  _HEAP_MAX_SIZE);
ae80: 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65  .    if( !pWinMe
ae90: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
aea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
aeb0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
aec0: 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65            "faile
aed0: 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20  d to HeapCreate 
aee0: 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c  (%lu), flags=%u,
aef0: 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61   initSize=%u, ma
af00: 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20  xSize=%u",.     
af10: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
af20: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
af30: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
af40: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
af50: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
af60: 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49  _SIZE, SQLITE_WI
af70: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
af80: 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  E);.      return
af90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
afa0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
afb0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
afc0: 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RUE;.    assert(
afd0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
afe0: 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  wned );.  }.#els
aff0: 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  e.  pWinMemData-
b000: 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72  >hHeap = osGetPr
b010: 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69  ocessHeap();.  i
b020: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
b030: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71  >hHeap ){.    sq
b040: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b050: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
b060: 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72  "failed to GetPr
b070: 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22  ocessHeap (%lu)"
b080: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b090: 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
b0a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b0b0: 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  }.  pWinMemData-
b0c0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
b0d0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e  .  assert( !pWin
b0e0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
b0f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
b100: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
b110: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
b120: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b130: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
b140: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b150: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b160: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b170: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b180: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b190: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b1a0: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
b1b0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
b1c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b1d0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
b1e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
b1f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b200: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
b210: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
b220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
b230: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
b240: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
b250: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
b260: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
b270: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
b280: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
b290: 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20  Data ) return;. 
b2a0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b2b0: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
b2c0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
b2d0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b2e0: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
b2f0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
b300: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
b310: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
b320: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
b330: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
b340: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b350: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b360: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b370: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b380: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b390: 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  ).    assert( os
b3a0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
b3b0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
b3c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b3d0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
b3e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
b3f0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
b400: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
b410: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
b420: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
b430: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
b440: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b450: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
b460: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
b470: 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  y (%lu), heap=%p
b480: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b490: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
b4a0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
b4b0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
b4c0: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
b4d0: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
b4e0: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
b4f0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
b500: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
b510: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
b520: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
b530: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
b540: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
b550: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
b560: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
b570: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
b580: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
b590: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
b5a0: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
b5b0: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
b5c0: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
b5d0: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
b5e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b5f0: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
b600: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
b610: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
b620: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
b630: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
b640: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
b650: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
b660: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
b670: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
b680: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
b690: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
b6a0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
b6b0: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
b6c0: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
b6d0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
b6e0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
b6f0: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
b700: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
b710: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
b720: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
b730: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
b740: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
b750: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
b760: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
b770: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
b780: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
b790: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
b7a0: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
b7b0: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
b7c0: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
b7d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b7e0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
b7f0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
b800: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
b810: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
b820: 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a  ode (UTF-16?). .
b830: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
b840: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
b850: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
b860: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
b870: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
b880: 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  R winUtf8ToUnico
b890: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
b8a0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
b8b0: 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52   nChar;.  LPWSTR
b8c0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
b8d0: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
b8e0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
b8f0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
b900: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
b910: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  , 0);.  if( nCha
b920: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
b930: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64  rn 0;.  }.  zWid
b940: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  eFilename = sqli
b950: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
b960: 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64  Char*sizeof(zWid
b970: 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  eFilename[0]) );
b980: 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65  .  if( zWideFile
b990: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
b9a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
b9b0: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
b9c0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
b9d0: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
b9e0: 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c  me, -1, zWideFil
b9f0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20         nChar);. 
ba20: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
ba30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ba40: 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  e(zWideFilename)
ba50: 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e  ;.    zWideFilen
ba60: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
ba70: 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e  eturn zWideFilen
ba80: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
ba90: 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20  nvert Microsoft 
baa0: 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38  Unicode to UTF-8
bab0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
bac0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
bad0: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
bae0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
baf0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
bb00: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e  atic char *winUn
bb10: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
bb20: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
bb30: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
bb40: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
bb50: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
bb60: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
bb70: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
bb80: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
bb90: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
bba0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
bbb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
bbc0: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
bbd0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
bbe0: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
bbf0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
bc00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
bc10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
bc20: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
bc30: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
bc40: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
bc50: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
bc60: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
bc90: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
bca0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
bcb0: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
bcc0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
bcd0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
bce0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
bcf0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
bd00: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20   ANSI string to 
bd10: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
bd20: 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  e, based on the.
bd30: 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70  ** current codep
bd40: 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72  age settings for
bd50: 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a   file apis..** .
bd60: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
bd70: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
bd80: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
bd90: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  .** from sqlite3
bda0: 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74  _malloc..*/.stat
bdb0: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63  ic LPWSTR winMbc
bdc0: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
bdd0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
bde0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
bdf0: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69    LPWSTR zMbcsFi
be00: 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f  lename;.  int co
be10: 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69  depage = osAreFi
be20: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
be30: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
be40: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
be50: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
be60: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
be70: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
be80: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57       0)*sizeof(W
beb0: 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79  CHAR);.  if( nBy
bec0: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  te==0 ){.    ret
bed0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62  urn 0;.  }.  zMb
bee0: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  csFilename = sql
bef0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
bf00: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62  nByte*sizeof(zMb
bf10: 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  csFilename[0]) )
bf20: 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c  ;.  if( zMbcsFil
bf30: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
bf40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
bf50: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
bf60: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
bf70: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
bf80: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46  name, -1, zMbcsF
bf90: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b           nByte);
bfc0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
bfd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
bfe0: 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  ree(zMbcsFilenam
bff0: 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c  e);.    zMbcsFil
c000: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
c010: 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c   return zMbcsFil
c020: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
c030: 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66  Convert Microsof
c040: 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c  t Unicode to mul
c050: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
c060: 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20  r string, based 
c070: 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73  on the.** user's
c080: 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a   ANSI codepage..
c090: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
c0a0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
c0b0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
c0c0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
c0d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
c0e0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
c0f0: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c  nUnicodeToMbcs(L
c100: 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  PCWSTR zWideFile
c110: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
c120: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  te;.  char *zFil
c130: 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64  ename;.  int cod
c140: 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c  epage = osAreFil
c150: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
c160: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
c170: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
c180: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
c190: 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  e(codepage, 0, z
c1a0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
c1b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
c1c0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
c1d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c1e0: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
c1f0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c200: 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20  Zero( nByte );. 
c210: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
c220: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c230: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
c240: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
c250: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
c260: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
c270: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
c280: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a    nByte, 0, 0);.
c2b0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
c2c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c2d0: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
c2e0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
c2f0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c300: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
c310: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c  *.** Convert mul
c320: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
c330: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38   string to UTF-8
c340: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
c350: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64   the.** returned
c360: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
c370: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
c380: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
c390: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
c3a0: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63  2_mbcs_to_utf8(c
c3b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
c3c0: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
c3d0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20  FilenameUtf8;.  
c3e0: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
c3f0: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77  ..  zTmpWide = w
c400: 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  inMbcsToUnicode(
c410: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
c420: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
c430: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c440: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
c450: 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  f8 = winUnicodeT
c460: 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b  oUtf8(zTmpWide);
c470: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c480: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
c490: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  urn zFilenameUtf
c4a0: 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  8;.}../*.** Conv
c4b0: 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c  ert UTF-8 to mul
c4c0: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
c4d0: 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20   string.  Space 
c4e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20  to hold the .** 
c4f0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
c500: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
c510: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
c520: 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  )..*/.char *sqli
c530: 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
c540: 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61  o_mbcs(const cha
c550: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
c560: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
c570: 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Mbcs;.  LPWSTR z
c580: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
c590: 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f  Wide = winUtf8To
c5a0: 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
c5b0: 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  e);.  if( zTmpWi
c5c0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
c5d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
c5e0: 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e  lenameMbcs = win
c5f0: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  UnicodeToMbcs(zT
c600: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
c610: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
c620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
c630: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a  enameMbcs;.}../*
c640: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c650: 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20  n sets the data 
c660: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65  directory or the
c670: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
c680: 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  tory based on.**
c690: 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72   the provided ar
c6a0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79  guments.  The ty
c6b0: 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  pe argument must
c6c0: 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74   be 1 in order t
c6d0: 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o set the.** dat
c6e0: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32  a directory or 2
c6f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74   in order to set
c700: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
c710: 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a  irectory.  The z
c720: 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  Value.** argumen
c730: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
c740: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
c750: 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75  o use.  The retu
c760: 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  rn value will be
c770: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
c780: 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
c790: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
c7a0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
c7b0: 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57  DWORD type, LPCW
c7c0: 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63  STR zValue){.  c
c7d0: 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72  har **ppDirector
c7e0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
c7f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
c800: 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  NIT.  int rc = s
c810: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
c820: 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
c830: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
c840: 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51  f.  if( type==SQ
c850: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
c860: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
c870: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
c880: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74  y = &sqlite3_dat
c890: 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  a_directory;.  }
c8a0: 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53  else if( type==S
c8b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
c8c0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
c8d0: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
c8e0: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65  ry = &sqlite3_te
c8f0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
c900: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  }.  assert( !ppD
c910: 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65  irectory || type
c920: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  ==SQLITE_WIN32_D
c930: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
c940: 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  PE.          || 
c950: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
c960: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
c970: 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73  Y_TYPE.  );.  as
c980: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
c990: 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d  ry || sqlite3Mem
c9a0: 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70  debugHasType(*pp
c9b0: 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59  Directory, MEMTY
c9c0: 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66  PE_HEAP) );.  if
c9d0: 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b  ( ppDirectory ){
c9e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75  .    char *zValu
c9f0: 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69  eUtf8 = 0;.    i
ca00: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61  f( zValue && zVa
ca10: 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lue[0] ){.      
ca20: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e  zValueUtf8 = win
ca30: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56  UnicodeToUtf8(zV
ca40: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20  alue);.      if 
ca50: 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20  ( zValueUtf8==0 
ca60: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ca70: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ca80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ca90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
caa0: 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  ppDirectory);.  
cab0: 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d    *ppDirectory =
cac0: 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20   zValueUtf8;.   
cad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cae0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
caf0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
cb00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ./*.** The retur
cb10: 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65  n value of winGe
cb20: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
cb30: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
cb40: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
cb50: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
cb60: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
cb70: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
cb80: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
cb90: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
cba0: 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
cbb0: 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52  astErrorMsg(DWOR
cbc0: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74  D lastErrno, int
cbd0: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
cbe0: 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
cbf0: 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
cc00: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
cc10: 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
cc20: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
cc30: 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
cc40: 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
cc50: 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
cc60: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
cc70: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
cc80: 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
cc90: 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
cca0: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
ccb0: 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
ccc0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
ccd0: 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20  WINRT.    WCHAR 
cce0: 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45  zTempWide[SQLITE
ccf0: 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53  _WIN32_MAX_ERRMS
cd00: 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20  G_CHARS+1];.    
cd10: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
cd20: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
cd30: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
cd40: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
cd70: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
cd80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
cda0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57            zTempW
ce10: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
ce40: 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c  AX_ERRMSG_CHARS,
ce50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
ce70: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53  ;.#else.    LPWS
ce80: 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e  TR zTempWide = N
ce90: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
cea0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
ceb0: 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  W(FORMAT_MESSAGE
cec0: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
ced0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
cf00: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
cf30: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
cf40: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
cf90: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfb0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70   (LPWSTR) &zTemp
cfe0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20     0);.#endif.  
d030: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
d040: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
d050: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
d060: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
d070: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
d080: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
d090: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
d0a0: 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  t = winUnicodeTo
d0b0: 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
d0c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
d0d0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
d0e0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
d0f0: 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66  WINRT.      /* f
d100: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
d110: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
d120: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
d130: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
d140: 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29  lFree(zTempWide)
d150: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
d160: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
d170: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
d180: 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
d190: 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a   *zTemp = NULL;.
d1a0: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
d1b0: 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52  rmatMessageA(FOR
d1c0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
d1d0: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
d200: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
d210: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
d240: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
d250: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53              (LPS
d2e0: 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20  TR) &zTemp,.    
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
d330: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
d340: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
d350: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
d360: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
d370: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
d380: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
d390: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
d3a0: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
d3b0: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
d3c0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
d3d0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
d3e0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
d3f0: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
d400: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
d410: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
d420: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
d430: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
d440: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
d450: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
d460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
d470: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
d480: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
d490: 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45  lx (%lu)", lastE
d4a0: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
d4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
d4c0: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
d4d0: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
d4e0: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
d4f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
d500: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
d510: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
d520: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
d530: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
d540: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d550: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
d560: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d570: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d580: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
d590: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
d5a0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
d5b0: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
d5c0: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
d5d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d5e0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
d5f0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
d600: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
d610: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
d620: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
d630: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
d640: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
d650: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
d660: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
d670: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
d680: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
d690: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
d6a0: 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61   .** FormatMessa
d6b0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
d6c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
d6d0: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
d6e0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
d6f0: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
d700: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
d710: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
d720: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
d730: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
d740: 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68  ANTOPEN). .** Th
d750: 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74  e two subsequent
d760: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c   arguments shoul
d770: 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  d be the name of
d780: 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e   the OS function
d790: 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20   that.** failed 
d7a0: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
d7b0: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
d7c0: 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ath, if any..*/.
d7d0: 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72  #define winLogEr
d7e0: 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77  ror(a,b,c,d)   w
d7f0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
d800: 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f  (a,b,c,d,__LINE_
d810: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  _).static int wi
d820: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
d830: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
d860: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f  or code */.  DWO
d870: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20  RD lastErrno,   
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d890: 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72  Win32 last error
d8a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
d8b0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
d8c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
d8d0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
d8e0: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
d8f0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d910: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
d920: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
d930: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
d960: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
d970: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
d980: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d   */.){.  char zM
d990: 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20  sg[500];        
d9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61           /* Huma
d9b0: 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n readable error
d9c0: 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69   text */.  int i
d9d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d9f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
da00: 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20   zMsg[0] = 0;.  
da10: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
da20: 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69  sg(lastErrno, si
da30: 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67  zeof(zMsg), zMsg
da40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72  );.  assert( err
da50: 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  code!=SQLITE_OK 
da60: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  );.  if( zPath==
da70: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
da80: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b    for(i=0; zMsg[
da90: 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  i] && zMsg[i]!='
daa0: 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  \r' && zMsg[i]!=
dab0: 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a  '\n'; i++){}.  z
dac0: 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  Msg[i] = 0;.  sq
dad0: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
dae0: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e  e,.      "os_win
daf0: 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28  .c:%d: (%lu) %s(
db00: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
db10: 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e   iLine, lastErrn
db20: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
db30: 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65   zMsg.  );..  re
db40: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
db50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  ./*.** The numbe
db60: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
db70: 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72  a ReadFile(), Wr
db80: 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44  iteFile(), and D
db90: 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77  eleteFile().** w
dba0: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66  ill be retried f
dbb0: 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69  ollowing a locki
dbc0: 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61  ng error - proba
dbd0: 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a  bly caused by .*
dbe0: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
dbf0: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
dc00: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
dc10: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
dc20: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
dc30: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
dc40: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
dc50: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
dc60: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
dc70: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
dc80: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
dc90: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
dca0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
dcb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
dcc0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
dcd0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
dce0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
dcf0: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
dd00: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
dd10: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
dd20: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
dd30: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
dd40: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
dd50: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
dd60: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
dd70: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  LAY;../*.** If a
dd80: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
dd90: 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
dda0: 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
ddb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ddc0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
ddd0: 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
dde0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
ddf0: 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
de00: 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
de10: 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
de20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de30: 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e  winRetryIoerr(in
de40: 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52  t *pnRetry, DWOR
de50: 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57  D *pError){.  DW
de60: 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73  ORD e = osGetLas
de70: 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  tError();.  if( 
de80: 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65  *pnRetry>=winIoe
de90: 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69  rrRetry ){.    i
dea0: 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
deb0: 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
dec0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ded0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d   0;.  }.  if( e=
dee0: 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45  =ERROR_ACCESS_DE
def0: 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d  NIED ||.      e=
df00: 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c  =ERROR_LOCK_VIOL
df10: 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65  ATION ||.      e
df20: 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f  ==ERROR_SHARING_
df30: 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20  VIOLATION ){.   
df40: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
df50: 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74  leep(winIoerrRet
df60: 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65  ryDelay*(1+*pnRe
df70: 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e  try));.    ++*pn
df80: 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72  Retry;.    retur
df90: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
dfa0: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45  Error ){.    *pE
dfb0: 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20  rror = e;.  }.  
dfc0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
dfd0: 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72  ** Log a I/O err
dfe0: 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65  or retry episode
dff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e000: 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74   winLogIoerr(int
e010: 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20   nRetry){.  if( 
e020: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
e030: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e040: 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22  _IOERR, .      "
e050: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
e060: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
e070: 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77  nflict",.      w
e080: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
e090: 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
e0a0: 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d  +1)/2.    );.  }
e0b0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
e0c0: 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  S_WINCE./*******
e0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69  **.** This secti
e120: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  on contains code
e130: 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e   for WinCE only.
e140: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
e150: 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43  (SQLITE_MSVC_LOC
e160: 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21  ALTIME_API) || !
e170: 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
e180: 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20  LTIME_API./*.** 
e190: 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20  The MSVC CRT on 
e1a0: 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e  Windows CE may n
e1b0: 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74  ot have a localt
e1c0: 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ime() function. 
e1d0: 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20   So.** create a 
e1e0: 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23  substitute..*/.#
e1f0: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
e200: 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64  .struct tm *__cd
e210: 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f  ecl localtime(co
e220: 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b  nst time_t *t).{
e230: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
e240: 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d   tm y;.  FILETIM
e250: 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59  E uTm, lTm;.  SY
e260: 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20  STEMTIME pTm;.  
e270: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36  sqlite3_int64 t6
e280: 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20  4;.  t64 = *t;. 
e290: 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31   t64 = (t64 + 11
e2a0: 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30  644473600)*10000
e2b0: 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77  000;.  uTm.dwLow
e2c0: 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52  DateTime = (DWOR
e2d0: 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46  D)(t64 & 0xFFFFF
e2e0: 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69  FFF);.  uTm.dwHi
e2f0: 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f  ghDateTime= (DWO
e300: 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a  RD)(t64 >> 32);.
e310: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f    osFileTimeToLo
e320: 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d  calFileTime(&uTm
e330: 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65  ,&lTm);.  osFile
e340: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
e350: 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79  (&lTm,&pTm);.  y
e360: 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77  .tm_year = pTm.w
e370: 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79  Year - 1900;.  y
e380: 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_mon = pTm.wM
e390: 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d  onth - 1;.  y.tm
e3a0: 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _wday = pTm.wDay
e3b0: 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d  OfWeek;.  y.tm_m
e3c0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a  day = pTm.wDay;.
e3d0: 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54    y.tm_hour = pT
e3e0: 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f  m.wHour;.  y.tm_
e3f0: 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74  min = pTm.wMinut
e400: 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20  e;.  y.tm_sec = 
e410: 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72  pTm.wSecond;.  r
e420: 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64  eturn &y;.}.#end
e430: 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44  if..#define HAND
e440: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29  LE_TO_WINFILE(a)
e450: 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68   (winFile*)&((ch
e460: 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66  ar*)a)[-(int)off
e470: 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29  setof(winFile,h)
e480: 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  ]../*.** Acquire
e490: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68   a lock on the h
e4a0: 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69  andle h.*/.stati
e4b0: 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65  c void winceMute
e4c0: 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20  xAcquire(HANDLE 
e4d0: 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45  h){.   DWORD dwE
e4e0: 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20  rr;.   do {.    
e4f0: 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46   dwErr = osWaitF
e500: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68  orSingleObject(h
e510: 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20  , INFINITE);.   
e520: 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21  } while (dwErr !
e530: 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20  = WAIT_OBJECT_0 
e540: 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54  && dwErr != WAIT
e550: 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f  _ABANDONED);.}./
e560: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c  *.** Release a l
e570: 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20  ock acquired by 
e580: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
e590: 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77  e().*/.#define w
e5a0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
e5b0: 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78  (h) ReleaseMutex
e5c0: 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  (h)../*.** Creat
e5d0: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
e5e0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73  shared memory us
e5f0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69  ed for locking i
e600: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65  n the file.** de
e610: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a  scriptor pFile.*
e620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
e630: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e  ceCreateLock(con
e640: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e650: 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  me, winFile *pFi
e660: 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54  le){.  LPWSTR zT
e670: 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61  ok;.  LPWSTR zNa
e680: 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  me;.  DWORD last
e690: 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c  Errno;.  BOOL bL
e6a0: 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  ogged = FALSE;. 
e6b0: 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52   BOOL bInit = TR
e6c0: 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77  UE;..  zName = w
e6d0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
e6e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
e6f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
e700: 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f    /* out of memo
e710: 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ry */.    return
e720: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
e730: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
e740: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
e750: 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a  cal lockdata */.
e760: 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d    memset(&pFile-
e770: 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  >local, 0, sizeo
e780: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
e790: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
e7a0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
e7b0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
e7c0: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
e7d0: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
e7e0: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
e7f0: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68  */.  zTok = osCh
e800: 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b  arLowerW(zName);
e810: 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a  .  for (;*zTok;z
e820: 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28  Tok++){.    if (
e830: 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a  *zTok == '\\') *
e840: 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a  zTok = '_';.  }.
e850: 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65  .  /* Create/ope
e860: 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65  n the named mute
e870: 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  x */.  pFile->hM
e880: 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d  utex = osCreateM
e890: 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53  utexW(NULL, FALS
e8a0: 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20  E, zName);.  if 
e8b0: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
e8c0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
e8d0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
e8e0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73  stError();.    s
e8f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
e900: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  e);.    return w
e910: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
e920: 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e  E_IOERR, pFile->
e930: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
e960: 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck1", zFilename)
e970: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
e980: 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65  ire the mutex be
e990: 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20  fore continuing 
e9a0: 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  */.  winceMutexA
e9b0: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
e9c0: 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53  utex);.  .  /* S
e9d0: 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
e9e0: 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
e9f0: 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
ea00: 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
ea10: 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65  re .  ** case-se
ea20: 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64  nsitive, take ad
ea30: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20  vantage of that 
ea40: 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74  by uppercasing t
ea50: 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20  he mutex name.  
ea60: 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61  ** and using tha
ea70: 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20  t as the shared 
ea80: 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65  filemapping name
ea90: 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55  ..  */.  osCharU
eaa0: 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  pperW(zName);.  
eab0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
eac0: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
ead0: 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
eae0: 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
eaf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
eb20: 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
eb30: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20          zName); 
eb70: 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c   ..  /* Set a fl
eb80: 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
eb90: 73 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73  s we're the firs
eba0: 74 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  t to create the 
ebb0: 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20  memory so it .  
ebc0: 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  ** must be zero-
ebd0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
ebe0: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
ebf0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
ec00: 20 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d   if (lastErrno =
ec10: 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f  = ERROR_ALREADY_
ec20: 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e  EXISTS){.    bIn
ec30: 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  it = FALSE;.  }.
ec40: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ec50: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
ec60: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
ec70: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
ec80: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
ec90: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
eca0: 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f( pFile->hShare
ecb0: 64 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  d ){.    pFile->
ecc0: 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c  shared = (winceL
ecd0: 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66  ock*)osMapViewOf
ece0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  File(pFile->hSha
ecf0: 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  red, .          
ed00: 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44     FILE_MAP_READ
ed10: 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c  |FILE_MAP_WRITE,
ed20: 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69   0, 0, sizeof(wi
ed30: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f  nceLock));.    /
ed40: 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69  * If mapping fai
ed50: 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73  led, close the s
ed60: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
ed70: 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74  dle and erase it
ed80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69   */.    if( !pFi
ed90: 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20  le->shared ){.  
eda0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
edb0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
edc0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
edd0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
ede0: 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e  E_IOERR, pFile->
edf0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
ee10: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c  nceCreateLock2",
ee20: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
ee30: 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55     bLogged = TRU
ee40: 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  E;.      osClose
ee50: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53  Handle(pFile->hS
ee60: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46  hared);.      pF
ee70: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e  ile->hShared = N
ee80: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
ee90: 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d    /* If shared m
eea0: 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20  emory could not 
eeb0: 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  be created, then
eec0: 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   close the mutex
eed0: 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69   and fail */.  i
eee0: 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f( pFile->hShare
eef0: 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  d==NULL ){.    i
ef00: 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20  f( !bLogged ){. 
ef10: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
ef20: 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
ef30: 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  o;.      winLogE
ef40: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
ef50: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
ef60: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ef70: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
ef80: 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65  ateLock3", zFile
ef90: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f  name);.      bLo
efa0: 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  gged = TRUE;.   
efb0: 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65   }.    winceMute
efc0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
efd0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43  hMutex);.    osC
efe0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
eff0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70  ->hMutex);.    p
f000: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e  File->hMutex = N
f010: 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ULL;.    return 
f020: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
f030: 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61  }.  .  /* Initia
f040: 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
f050: 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
f060: 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
f070: 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20   if( bInit ){.  
f080: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
f090: 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
f0a0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
f0b0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
f0c0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
f0d0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
f0e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f0f0: 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
f100: 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
f110: 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
f120: 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
f130: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
f140: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
f150: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
f160: 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
f170: 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
f180: 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
f190: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
f1a0: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
f1b0: 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
f1c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
f1d0: 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
f1e0: 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
f1f0: 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
f200: 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
f210: 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
f220: 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
f230: 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
f240: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
f250: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
f260: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
f270: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
f280: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
f290: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
f2a0: 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
f2b0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
f2c0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
f2d0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
f2e0: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
f2f0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
f300: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
f310: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
f320: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
f330: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
f340: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
f350: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
f360: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
f370: 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
f380: 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
f390: 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
f3a0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
f3b0: 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
f3c0: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
f3d0: 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
f3e0: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
f3f0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
f400: 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
f410: 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
f420: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
f430: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
f440: 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43  ex);    .    osC
f450: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
f460: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70  ->hMutex);.    p
f470: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e  File->hMutex = N
f480: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  ULL;.  }.}../* .
f490: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
f4a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
f4b0: 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
f4c0: 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
f4d0: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
f4e0: 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
f4f0: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
f500: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
f510: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
f520: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
f530: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
f540: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
f550: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
f560: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
f570: 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
f580: 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
f590: 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
f5a0: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
f5b0: 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
f5c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f5d0: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
f5e0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
f5f0: 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
f600: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
f610: 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
f620: 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
f630: 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
f640: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
f650: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
f660: 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
f670: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
f680: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
f690: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
f6a0: 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
f6b0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
f6c0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
f6d0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
f6e0: 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
f6f0: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
f700: 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
f710: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
f720: 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
f730: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
f740: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
f750: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
f760: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
f770: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
f780: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
f790: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
f7a0: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
f7b0: 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
f7c0: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
f7d0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
f7e0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
f7f0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
f800: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
f810: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
f820: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
f830: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
f840: 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
f850: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
f860: 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
f870: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
f880: 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
f890: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
f8a0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
f8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f8c0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
f8d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
f8e0: 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
f8f0: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
f900: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
f910: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
f920: 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
f930: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
f940: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
f950: 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
f960: 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
f970: 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
f980: 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
f990: 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
f9a0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
f9b0: 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
f9c0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
f9d0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
f9e0: 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
f9f0: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
fa00: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
fa10: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
fa20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
fa30: 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
fa40: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
fa50: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
fa60: 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
fa70: 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
fa80: 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
fa90: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
faa0: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
fab0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
fac0: 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
fad0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fae0: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
faf0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
fb00: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
fb10: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
fb20: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
fb30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
fb40: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
fb50: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
fb60: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
fb70: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
fb80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
fb90: 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
fba0: 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
fbb0: 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
fbc0: 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
fbd0: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
fbe0: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
fbf0: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
fc00: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
fc10: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
fc20: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
fc30: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
fc40: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
fc50: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
fc60: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
fc70: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
fc80: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
fc90: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
fca0: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
fcb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
fcc0: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
fcd0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
fce0: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
fcf0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
fd00: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
fd10: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
fd20: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
fd30: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
fd40: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
fd50: 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
fd60: 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
fd70: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
fd80: 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
fd90: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
fda0: 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
fdb0: 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
fdc0: 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
fdd0: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
fde0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
fdf0: 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
fe00: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
fe10: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
fe20: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
fe30: 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
fe40: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
fe50: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
fe60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fe70: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
fe80: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
fe90: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
fea0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
feb0: 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
fec0: 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
fed0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
fee0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
fef0: 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
ff00: 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
ff10: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
ff20: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
ff30: 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
ff40: 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
ff50: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
ff60: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
ff70: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
ff80: 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
ff90: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
ffa0: 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
ffb0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
ffc0: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
ffd0: 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
ffe0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
fff0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
10000 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
10010 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
10020 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
10030 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10040 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
10050 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
10060 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
10070 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
10080 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10090 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
100a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
100b0 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
100c0 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
100d0 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
100e0 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
100f0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
10110 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
10120 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
10130 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10140 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
10150 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
10160 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
10170 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
10180 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
10190 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
101a0 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
101b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
101c0 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
101d0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
101e0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
101f0 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
10200 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10210 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
10220 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
10230 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
10240 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
10250 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
10260 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
10270 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
10280 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
102d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
102e0 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
102f0 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
10300 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
10310 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
10320 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10330 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
10340 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
10350 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
10360 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
10370 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
10380 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
10390 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
103a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
103b0 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
103c0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
103d0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
103e0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
103f0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
10400 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
10410 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
10420 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
10430 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
10440 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
10450 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
10460 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
10470 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
10480 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
10490 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
104a0 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
104b0 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
104c0 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
104d0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
104e0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
104f0 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
10500 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
10510 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
10520 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
10530 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
10540 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
10550 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
10560 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
10570 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
10580 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
10590 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
105a0 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
105b0 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
105c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
105d0 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
105e0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
105f0 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
10600 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
10610 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
10620 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
10630 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
10640 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
10650 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
10660 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
10670 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
10680 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
10690 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
106a0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
106b0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
106c0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
106d0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
106e0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
106f0 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
10700 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
10710 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
10720 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
10730 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
10740 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
10770 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
10780 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
10790 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
107a0 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
107b0 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
107c0 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
107d0 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
107e0 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
107f0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
10800 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
10810 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
10820 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
10830 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
10840 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
10850 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
10860 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
10870 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
10880 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
10890 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
108a0 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
108d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10930 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
10940 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
10950 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
10960 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
10970 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
10980 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
10990 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
109f0 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
10a00 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
10a10 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
10a20 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
10a30 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
10a40 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
10a50 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
10a60 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
10a70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
10a80 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
10a90 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
10aa0 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
10ab0 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
10ac0 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
10ad0 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
10ae0 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
10af0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
10b00 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
10b10 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
10b20 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
10b30 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
10b40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
10b50 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  eekFile(winFile 
10b60 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
10b70 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
10b80 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
10b90 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65  INRT.  LONG uppe
10ba0 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
10bb0 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73         /* Most s
10bc0 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
10bd0 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c  ew offset */.  L
10be0 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20  ONG lowerBits;  
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c00 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20  * Least sig. 32 
10c10 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
10c20 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  et */.  DWORD dw
10c30 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
10c40 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
10c50 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
10c60 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f  FilePointer() */
10c70 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
10c80 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
10c90 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
10ca0 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
10cb0 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54  rror() */..  OST
10cc0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
10cd0 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
10ce0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69  \n", pFile->h, i
10cf0 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70  Offset));..  upp
10d00 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
10d10 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
10d20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
10d30 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
10d40 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
10d50 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
10d60 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
10d70 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
10d80 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
10d90 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
10da0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
10db0 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
10dc0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
10dd0 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
10de0 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
10df0 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
10e00 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
10e10 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
10e20 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
10e30 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
10e40 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
10e50 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
10e60 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
10e70 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
10e80 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
10e90 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
10ea0 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61  ccurred, it is a
10eb0 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f  lso necessary to
10ec0 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c   call .  ** GetL
10ed0 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f  astError()..  */
10ee0 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74  .  dwRet = osSet
10ef0 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
10f00 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
10f10 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
10f20 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
10f30 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44   (dwRet==INVALID
10f40 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
10f50 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  R.      && ((las
10f60 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
10f70 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
10f80 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46  RROR)) ){.    pF
10f90 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10fa0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
10fb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10fc0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
10fd0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
10fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ff0 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20   "winSeekFile", 
11000 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
11010 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45     OSTRACE(("SEE
11020 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
11030 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c  LITE_IOERR_SEEK\
11040 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11050 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11060 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
11070 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
11080 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
11090 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
110a0 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn 0;.#else.  /*
110b0 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62  .  ** Same as ab
110c0 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
110d0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
110e0 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57  tion works for W
110f0 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41  inRT..  */..  LA
11100 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20  RGE_INTEGER x;  
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11120 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20   The new offset 
11130 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20  */.  BOOL bRet; 
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
11160 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c  turned by SetFil
11170 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a  ePointerEx() */.
11180 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20  .  x.QuadPart = 
11190 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20  iOffset;.  bRet 
111a0 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
111b0 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78  erEx(pFile->h, x
111c0 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  , 0, FILE_BEGIN)
111d0 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a  ;..  if(!bRet){.
111e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
111f0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11200 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
11210 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11220 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
11230 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
11250 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69  inSeekFile", pFi
11260 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
11270 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
11280 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
11290 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c  E_IOERR_SEEK\n",
112a0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
112b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
112c0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
112d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
112e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
112f0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
11300 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  0;.#endif.}..#if
11310 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
11320 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61  _SIZE>0./* Forwa
11330 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
11340 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68   VFS helper meth
11350 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  ods used for mem
11360 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
11370 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
11380 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  inMapfile(winFil
11390 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  e*, sqlite3_int6
113a0 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  4);.static int w
113b0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
113c0 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ile*);.#endif../
113d0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
113e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72  e..**.** It is r
113f0 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20  eported that an 
11400 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65  attempt to close
11410 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20   a handle might 
11420 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69  sometimes.** fai
11430 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65  l.  This is a ve
11440 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ry unreasonable 
11450 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64  result, but Wind
11460 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73  ows is notorious
11470 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e  .** for being un
11480 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20  reasonable so I 
11490 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61  do not doubt tha
114a0 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65  t it might happe
114b0 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c  n.  If.** the cl
114c0 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61  ose fails, we pa
114d0 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c  use for 100 mill
114e0 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
114f0 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d   again.  As.** m
11500 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f  any as MX_CLOSE_
11510 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73  ATTEMPT attempts
11520 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61   to close the ha
11530 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65  ndle are made be
11540 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75  fore.** giving u
11550 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
11560 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
11570 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  fine MX_CLOSE_AT
11580 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69  TEMPT 3.static i
11590 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69  nt winClose(sqli
115a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
115b0 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
115c0 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
115d0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
115e0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  d;..  assert( id
115f0 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  !=0 );.#ifndef S
11600 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
11610 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
11620 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  pShm==0 );.#endi
11630 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  f.  assert( pFil
11640 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46  e->h!=NULL && pF
11650 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f  ile->h!=INVALID_
11660 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
11670 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
11680 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46  E file=%p\n", pF
11690 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53  ile->h));..#if S
116a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
116b0 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70  IZE>0.  winUnmap
116c0 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e  file(pFile);.#en
116d0 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72  dif..  do{.    r
116e0 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
116f0 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
11700 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
11710 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
11720 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
11730 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
11740 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
11750 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
11760 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77  PT && (sqlite3_w
11770 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c  in32_sleep(100),
11780 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
11790 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
117a0 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
117b0 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
117c0 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
117d0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
117e0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
117f0 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
11800 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11810 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
11820 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
11830 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
11840 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
11850 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
11860 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
11870 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
11880 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
11890 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
118a0 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
118b0 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
118c0 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
118d0 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a  _sleep(100);  /*
118e0 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62   Wait a little b
118f0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61  efore trying aga
11900 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  in */.    }.    
11910 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
11920 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
11930 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
11940 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11950 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b  pFile->h = NULL;
11960 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  .  }.  OpenCount
11970 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43  er(-1);.  OSTRAC
11980 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
11990 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
119a0 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
119b0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
119c0 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
119d0 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
119e0 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
119f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
11a00 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
11a10 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
11a40 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
11a50 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
11a60 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
11a70 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
11a80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
11a90 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
11aa0 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
11ab0 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
11ac0 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
11ad0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
11ae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
11af0 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
11b00 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
11b10 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
11b20 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
11b30 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
11b40 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11b50 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
11b60 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
11b70 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
11b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11b90 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
11ba0 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
11bb0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
11bc0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
11bd0 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
11be0 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
11bf0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11c00 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
11c10 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
11c20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
11c30 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
11c40 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
11c50 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
11c60 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
11c70 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
11c80 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ca0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11cb0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
11cc0 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
11cd0 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cf0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
11d00 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
11d10 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
11d20 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
11d30 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
11d40 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
11d50 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
11d60 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a  TE_IOERR_READ);.
11d70 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
11d80 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
11d90 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
11da0 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
11db0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
11dc0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
11dd0 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
11de0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11df0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
11e00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
11e10 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
11e20 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
11e30 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
11e40 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
11e50 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
11e60 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
11e70 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
11e80 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
11e90 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
11ea0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
11eb0 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
11ec0 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
11ed0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
11ee0 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
11ef0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
11f00 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
11f10 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
11f20 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66  CE(("READ-MMAP f
11f30 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
11f40 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
11f50 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
11f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
11f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
11f80 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
11f90 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
11fa0 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
11fb0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
11fc0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
11fd0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
11fe0 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
11ff0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
12000 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
12010 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
12020 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
12030 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
12040 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
12050 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
12060 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c    if( winSeekFil
12070 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
12080 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
12090 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
120a0 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
120b0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
120c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
120d0 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69  _FULL;.  }.  whi
120e0 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
120f0 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
12100 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20  amt, &nRead, 0) 
12110 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65  ){.#else.  memse
12120 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
12130 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
12140 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70  PED));.  overlap
12150 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
12160 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
12170 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72  fffffff);.  over
12180 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
12190 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
121a0 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
121b0 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  ffff);.  while( 
121c0 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
121d0 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
121e0 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61   &nRead, &overla
121f0 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20  pped) &&.       
12200 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
12210 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  ()!=ERROR_HANDLE
12220 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20  _EOF ){.#endif. 
12230 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
12240 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52  no;.    if( winR
12250 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
12260 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
12270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
12280 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12290 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
122a0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
122b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
122c0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22  TE_IOERR_READ\n"
122d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
122e0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
122f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
12300 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c  R_READ, pFile->l
12310 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c   "winRead", pFil
12340 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
12350 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
12360 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  try);.  if( nRea
12370 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a  d<(DWORD)amt ){.
12380 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
12390 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
123a0 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
123b0 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
123c0 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
123d0 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d  f)[nRead], 0, am
123e0 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53  t-nRead);.    OS
123f0 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
12400 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12410 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
12420 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12440 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
12450 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  EAD;.  }..  OSTR
12460 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
12470 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
12480 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12490 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
124a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
124b0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
124c0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
124d0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
124e0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
124f0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
12500 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
12510 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
12520 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
12530 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
12540 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
12550 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
12560 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
12570 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12590 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
125a0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
125b0 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
125e0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
125f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
12600 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
12610 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
12620 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
12630 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
12640 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
12670 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12680 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
12690 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
126a0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
126b0 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
126c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
126d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
126e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
126f0 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
12700 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
12710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
12720 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
12730 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
12740 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
12750 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
12760 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
12770 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
12780 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
12790 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  TE file=%p, buff
127a0 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
127b0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c  , offset=%lld, l
127c0 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
127d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
127e0 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
127f0 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
12800 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
12810 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12820 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
12830 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
12840 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
12850 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
12860 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
12870 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
12880 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
12890 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
128a0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
128b0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
128c0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
128d0 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
128e0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
128f0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
12900 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
12910 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
12920 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
12930 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d  TRACE(("WRITE-MM
12940 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
12950 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
12960 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
12970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12980 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12990 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
129a0 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
129b0 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
129c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
129d0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
129e0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
129f0 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
12a00 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
12a10 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
12a20 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
12a30 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
12a40 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
12a50 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
12a60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
12a70 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65  NCE.  rc = winSe
12a80 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  ekFile(pFile, of
12a90 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
12aa0 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a  =0 ){.#else.  {.
12ab0 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
12ac0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
12ad0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
12ae0 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
12af0 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
12b00 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
12b10 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
12b20 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
12b30 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
12b40 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
12b50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
12b60 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
12b70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12b80 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
12b90 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
12ba0 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
12bd0 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
12be0 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
12bf0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12c00 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
12c10 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12c20 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
12c30 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
12c40 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
12c50 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
12c60 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
12c70 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
12c80 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
12c90 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
12ca0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
12cb0 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
12cc0 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
12cd0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
12ce0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
12cf0 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c  #endif..    whil
12d00 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66  e( nRem>0 ){.#if
12d10 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
12d20 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
12d30 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
12d40 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
12d50 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
12d60 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
12d70 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
12d80 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
12d90 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
12da0 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
12db0 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52          if( winR
12dc0 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
12dd0 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
12de0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12df0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12e00 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
12e10 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
12e20 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d  ite<=(DWORD)nRem
12e30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57   );.      if( nW
12e40 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
12e50 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b  e>(DWORD)nRem ){
12e60 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
12e70 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
12e80 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
12e90 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
12ea0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12eb0 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  CE.      offset 
12ec0 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
12ed0 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
12ee0 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
12ef0 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
12f00 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
12f10 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
12f20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
12f30 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
12f40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
12f50 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  aRem += nWrite;.
12f60 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57        nRem -= nW
12f70 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rite;.    }.    
12f80 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  if( nRem>0 ){.  
12f90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12fa0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
12fb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
12fc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
12fd0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20   rc ){.    if(  
12fe0 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
12ff0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  rno==ERROR_HANDL
13000 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20  E_DISK_FULL ).  
13010 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d       || ( pFile-
13020 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
13030 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a  R_DISK_FULL )){.
13040 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
13050 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  WRITE file=%p, r
13060 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
13070 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13080 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
13090 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55  gError(SQLITE_FU
130a0 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  LL, pFile->lastE
130b0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
130d0 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c  winWrite1", pFil
130e0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
130f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
13100 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
13110 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  =SQLITE_IOERR_WR
13120 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ITE\n", pFile->h
13130 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
13140 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
13150 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
13160 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13180 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
13190 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
131a0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
131b0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
131c0 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  try);.  }.  OSTR
131d0 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
131e0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
131f0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
13200 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13210 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
13220 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
13230 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
13240 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
13250 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
13260 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
13270 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
13280 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e  64 nByte){.  win
13290 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
132a0 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
132b0 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  File handle obje
132c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
132d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
132e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
132f0 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  n code for this 
13300 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57  function */.  DW
13310 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
13320 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13330 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
13340 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
13350 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
13360 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
13370 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70  TRUNCATE file=%p
13380 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63  , size=%lld, loc
13390 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
133a0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42      pFile->h, nB
133b0 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  yte, pFile->lock
133c0 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  type));..  /* If
133d0 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
133e0 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
133f0 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
13400 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
13410 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
13420 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
13430 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
13440 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
13450 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
13460 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
13470 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
13480 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
13490 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
134a0 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
134b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
134c0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
134d0 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
134e0 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
134f0 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
13500 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
13510 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
13520 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c    /* SetEndOfFil
13530 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  e() returns non-
13540 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73  zero when succes
13550 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68  sful, or zero wh
13560 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  en it fails. */.
13570 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c    if( winSeekFil
13580 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20  e(pFile, nByte) 
13590 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
135a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
135b0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
135c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
135d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135e0 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
135f0 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te1", pFile->zPa
13600 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  th);.  }else if(
13610 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69   0==osSetEndOfFi
13620 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a  le(pFile->h) &&.
13630 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61              ((la
13640 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13650 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
13660 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46  OR_USER_MAPPED_F
13670 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ILE) ){.    pFil
13680 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13690 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
136a0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
136b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
136c0 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
136d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
136f0 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69  nTruncate2", pFi
13700 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
13710 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13720 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
13730 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
13740 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
13750 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
13760 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
13770 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
13780 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
13790 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
137a0 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
137b0 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20  QLite will.  ** 
137c0 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
137d0 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
137e0 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
137f0 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
13800 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
13810 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
13820 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65  n && nByte<pFile
13830 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
13840 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
13850 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23  e = nByte;.  }.#
13860 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
13870 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
13880 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
13890 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
138a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
138b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
138c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
138d0 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
138e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
138f0 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
13900 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
13910 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
13920 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
13930 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
13940 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
13950 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
13960 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
13970 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
13980 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
13990 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
139a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
139b0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
139c0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
139d0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
139e0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
139f0 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73  ic int winSync(s
13a00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13a10 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66   int flags){.#if
13a20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  ndef SQLITE_NO_S
13a30 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  YNC.  /*.  ** Us
13a40 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c  ed only when SQL
13a50 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
13a60 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a  ot defined..   *
13a70 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e  /.  BOOL rc;.#en
13a80 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
13a90 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66  (NDEBUG) || !def
13aa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
13ab0 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64  YNC) || \.    (d
13ac0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
13ad0 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
13ae0 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20  QLITE_DEBUG)).  
13af0 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65  /*.  ** Used whe
13b00 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
13b10 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
13b20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72  and by the asser
13b30 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  t() and/or.  ** 
13b40 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73  OSTRACE() macros
13b50 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  ..   */.  winFil
13b60 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
13b70 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20  ile*)id;.#else. 
13b80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13b90 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  R(id);.#endif.. 
13ba0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13bb0 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ;.  /* Check tha
13bc0 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
13bd0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
13be0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
13bf0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
13c00 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
13c10 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
13c20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
13c30 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
13c40 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
13c50 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
13c60 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
13c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
13c80 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
13c90 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
13ca0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
13cb0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
13cc0 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
13cd0 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
13ce0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
13cf0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
13d00 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41  FULL );..  OSTRA
13d10 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
13d20 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63  p, flags=%x, loc
13d30 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
13d40 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c      pFile->h, fl
13d50 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ags, pFile->lock
13d60 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66  type));..#ifndef
13d70 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55   SQLITE_TEST.  U
13d80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13d90 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20  flags);.#else.  
13da0 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29  if( (flags&0x0F)
13db0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
13dc0 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
13dd0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
13de0 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
13df0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
13e00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
13e10 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
13e20 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
13e30 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
13e40 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
13e50 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
13e60 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
13e70 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  C.  OSTRACE(("SY
13e80 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20  NC-NOP file=%p, 
13e90 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
13ea0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
13eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13ec0 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73  .#else.  rc = os
13ed0 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
13ee0 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69  (pFile->h);.  Si
13ef0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
13f00 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28  c=FALSE );.  if(
13f10 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41   rc ){.    OSTRA
13f20 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
13f30 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13f40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13f50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f60 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
13f70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13f80 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
13f90 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52  rror();.    OSTR
13fa0 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d  ACE(("SYNC file=
13fb0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
13fc0 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46  ERR_FSYNC\n", pF
13fd0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13fe0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
13ff0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
14000 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
14010 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14030 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  inSync", pFile->
14040 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
14050 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
14060 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
14070 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
14080 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
14090 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
140a0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
140b0 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
140c0 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
140d0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
140e0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
140f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14100 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
14110 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
14120 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  ( pSize!=0 );.  
14130 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14150 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53  ERR_FSTAT);.  OS
14160 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
14170 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e  e=%p, pSize=%p\n
14180 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69  ", pFile->h, pSi
14190 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ze));..#if SQLIT
141a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
141b0 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
141c0 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
141d0 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
141e0 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
141f0 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
14200 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
14240 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
14250 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
14260 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
14270 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
14280 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
14290 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
142a0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
142b0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
142c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
142d0 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
142e0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14300 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
14310 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14320 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
14330 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
14340 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
14350 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
14360 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
14370 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
14380 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
14390 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
143a0 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
143b0 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
143c0 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
143d0 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
143e0 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
143f0 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
14400 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
14410 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
14420 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
14430 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
14440 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
14450 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
14460 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
14470 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
14480 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
14490 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
144a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
144b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
144c0 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
144d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
144e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
144f0 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
14500 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70  %p, pSize=%p, *p
14510 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73  Size=%lld, rc=%s
14520 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14530 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c  pFile->h, pSize,
14540 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33   *pSize, sqlite3
14550 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
14560 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14570 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
14580 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
14590 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
145a0 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
145b0 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
145c0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
145d0 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
145e0 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
145f0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
14600 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c  endif..#ifndef L
14610 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
14620 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
14630 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
14640 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66  VE_LOCK 2.#endif
14650 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63  ../*.** Historic
14660 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73  ally, SQLite has
14670 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c   used both the L
14680 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b  ockFile and Lock
14690 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73  FileEx functions
146a0 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f  ..** When the Lo
146b0 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  ckFile function 
146c0 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73  was used, it was
146d0 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
146e0 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65   to fail.** imme
146f0 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
14700 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
14710 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f   obtained.  Also
14720 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65  , it always expe
14730 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69  cted to.** obtai
14740 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  n an exclusive l
14750 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ock.  These flag
14760 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20  s are used with 
14770 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
14780 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  unction.** and r
14790 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70  eflect those exp
147a0 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65  ectations; there
147b0 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c  fore, they shoul
147c0 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  d not be changed
147d0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
147e0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
147f0 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
14800 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
14810 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  S   (LOCKFILE_FA
14820 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c  IL_IMMEDIATELY |
14830 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58       LOCKFILE_EX
14860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65  CLUSIVE_LOCK).#e
14870 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  ndif../*.** Curr
14880 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65  ently, SQLite ne
14890 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f  ver calls the Lo
148a0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
148b0 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e  n without wantin
148c0 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  g the.** call to
148d0 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c   fail immediatel
148e0 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  y if the lock ca
148f0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
14900 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
14910 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
14920 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
14930 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
14940 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f  FLAGS (LOCKFILE_
14950 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
14960 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
14970 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
14980 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
14990 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
149a0 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
149b0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
149c0 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
149d0 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
149e0 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
149f0 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
14a00 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
14a10 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53  .  int res;.  OS
14a20 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
14a30 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
14a40 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
14a50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14a60 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
14a70 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
14a80 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
14a90 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
14aa0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
14ab0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
14ac0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
14ad0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
14ae0 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
14af0 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
14b00 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
14b10 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
14b20 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
14b30 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
14b40 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
14b50 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
14b60 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
14b70 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
14b80 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
14bb0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
14bc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
14bd0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
14be0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
14bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
14c00 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
14c10 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
14c20 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
14c30 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
14c40 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
14c50 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
14c60 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
14c70 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
14c80 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
14c90 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
14cc0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
14cd0 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
14ce0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14cf0 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
14d00 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14d10 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
14d20 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
14d30 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
14d40 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
14d50 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  /.  }.  OSTRACE(
14d60 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
14d70 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
14d80 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
14d90 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a  ErrName(res)));.
14da0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
14db0 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
14dc0 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
14dd0 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65   int winUnlockRe
14de0 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
14df0 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
14e00 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  s;.  DWORD lastE
14e10 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28  rrno;.  OSTRACE(
14e20 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
14e30 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  le=%p, lock=%d\n
14e40 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
14e50 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
14e60 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
14e70 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
14e80 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
14e90 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
14ea0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
14eb0 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65  E, 0);.  }.#ifde
14ec0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
14ed0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
14ee0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
14ef0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14f00 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
14f10 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
14f20 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
14f30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14f40 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
14f50 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14f60 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
14f70 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
14f80 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
14f90 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
14fa0 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
14fb0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14fc0 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
14fd0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14fe0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
14ff0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20  nlockReadLock", 
15000 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15010 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
15020 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  EAD-UNLOCK file=
15030 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
15040 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
15050 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20  rrName(res)));. 
15060 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
15070 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
15080 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
15090 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
150a0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
150b0 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
150c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
150d0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
150e0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
150f0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
15100 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
15110 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
15120 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
15130 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
15140 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
15150 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
15160 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
15170 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
15180 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
15190 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
151a0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
151b0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
151c0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
151d0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
151e0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
151f0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
15200 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
15210 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
15220 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
15230 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
15240 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
15250 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
15260 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
15270 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
15280 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
15290 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
152a0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
152b0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
152c0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
152d0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
152e0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
152f0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15300 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
15310 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
15320 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
15330 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
15340 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
15350 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
15360 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
15370 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
15380 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
15390 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
153a0 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
153b0 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
153c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
153d0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
153e0 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
153f0 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
15400 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
15410 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
15420 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
15430 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
15440 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15450 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
15460 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15470 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
15480 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
15490 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
154a0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
154b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
154c0 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
154d0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
154e0 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
154f0 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
15500 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
15510 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
15520 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
15530 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
15540 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
15550 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
15560 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
15570 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
15580 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
15590 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
155a0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
155b0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
155c0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
155d0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "LOCK file=%p, o
155e0 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
155f0 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
15600 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15610 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
15620 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
15630 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
15640 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
15650 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
15660 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
15670 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
15680 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
15690 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
156a0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
156b0 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
156c0 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
156d0 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
156e0 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
156f0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
15700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
15710 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
15720 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
15730 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c  TRACE(("LOCK-HEL
15740 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
15750 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
15760 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
15770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15780 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
15790 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
157a0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
157b0 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
157c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
157d0 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
157e0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
157f0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
15800 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
15810 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
15820 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
15830 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
15840 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
15850 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
15860 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
15870 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
15880 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
15890 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
158a0 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
158b0 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
158c0 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
158d0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
158e0 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
158f0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
15900 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
15910 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
15920 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
15930 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15940 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65  ;.  if(   (pFile
15950 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
15960 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20  OCK).     || (  
15970 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
15980 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20  USIVE_LOCK).    
15990 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e       && (pFile->
159a0 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
159b0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
159c0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
159d0 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
159e0 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e  >0 && (res = win
159f0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
15a00 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
15a10 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
15a50 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
15a60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
15a70 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
15a80 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
15a90 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
15aa0 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
15ab0 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
15ac0 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
15ad0 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
15ae0 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
15af0 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
15b00 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
15b10 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
15b20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
15b30 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
15b40 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
15b50 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
15b60 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
15b70 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
15b80 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
15b90 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
15ba0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15bb0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
15bc0 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c  PENDING-FAIL fil
15bd0 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
15be0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
15bf0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15c00 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45  h, cnt, sqlite3E
15c10 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20  rrName(res)));. 
15c20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
15c30 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
15c40 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
15c50 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
15c60 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
15c70 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
15c80 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
15c90 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
15ca0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
15cb0 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
15cc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
15cd0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
15ce0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
15cf0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
15d00 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
15d10 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
15d20 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
15d30 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
15d40 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
15d50 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
15d60 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
15d70 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
15d80 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15d90 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
15da0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
15db0 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
15dc0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
15dd0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
15de0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
15df0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
15e00 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
15e10 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
15e20 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
15e30 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
15e40 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53  KFILE_FLAGS, RES
15e50 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
15e60 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
15e70 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
15e80 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
15e90 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
15ea0 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
15eb0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15ec0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
15ed0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
15ee0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
15ef0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
15f00 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
15f10 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
15f20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
15f30 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
15f40 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
15f50 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
15f60 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
15f70 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
15f80 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
15f90 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
15fa0 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
15fb0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
15fc0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
15fd0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  ;.    res = winU
15fe0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
15ff0 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  ile);.    res = 
16000 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
16010 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
16020 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48  CKFILE_FLAGS, SH
16030 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
16060 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
16070 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
16080 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
16090 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
160a0 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
160b0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
160c0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
160d0 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
160e0 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
160f0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
16100 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
16110 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
16120 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
16130 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
16140 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
16150 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
16160 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
16170 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
16180 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
16190 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
161a0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
161b0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
161c0 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
161d0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
161e0 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
161f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
16200 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
16210 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
16220 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
16230 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
16240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
16260 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16270 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
16280 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16290 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
162a0 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25  LOCK-FAIL file=%
162b0 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f  p, wanted=%d, go
162c0 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
162d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
162e0 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
162f0 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70  ktype));.  }.  p
16300 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
16310 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65   (u8)newLocktype
16320 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
16330 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
16340 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
16350 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16360 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
16370 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ype, sqlite3ErrN
16380 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
16390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
163a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
163b0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
163c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
163d0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
163e0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
163f0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
16400 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
16410 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
16420 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e  eld, return.** n
16430 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  on-zero, otherwi
16440 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  se zero..*/.stat
16450 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52  ic int winCheckR
16460 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
16470 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16480 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
16490 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65  nt rc;.  winFile
164a0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
164b0 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
164c0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
164d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
164e0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
164f0 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  K; );.  OSTRACE(
16500 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
16510 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
16520 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
16530 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61   pResOut));..  a
16540 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
16550 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
16560 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
16570 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
16580 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
16590 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
165a0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c  ile=%p, rc=%d (l
165b0 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
165c0 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73  >h, rc));.  }els
165d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  e{.    rc = winL
165e0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
165f0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16600 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52  LEEX_FLAGS,RESER
16610 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
16620 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
16630 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63  {.      winUnloc
16640 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16650 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16660 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
16670 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20      rc = !rc;.  
16680 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16690 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
166a0 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29  , rc=%d (remote)
166b0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
166c0 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  c));.  }.  *pRes
166d0 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
166e0 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
166f0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
16700 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
16710 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
16720 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
16730 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
16740 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
16750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16760 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
16770 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
16780 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
16790 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
167a0 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
167b0 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
167c0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
167d0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
167e0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
167f0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
16800 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
16810 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
16820 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
16830 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
16840 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
16850 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
16860 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
16870 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
16880 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
16890 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
168a0 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
168b0 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
168c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
168d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
168e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
168f0 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
16900 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
16910 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
16920 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16930 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
16940 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
16950 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
16960 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
16970 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
16980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
16990 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
169a0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
169b0 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
169c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
169d0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
169e0 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
169f0 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
16a00 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16a10 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
16a20 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
16a30 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
16a40 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  pe));.  type = p
16a50 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
16a60 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
16a70 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16a80 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
16a90 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
16aa0 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
16ab0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
16ac0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
16ad0 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77  HARED_LOCK && !w
16ae0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
16af0 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
16b00 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
16b10 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
16b20 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
16b30 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
16b40 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
16b50 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
16b60 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
16b70 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
16b80 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73  UNLOCK, osGetLas
16b90 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bb0 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46   "winUnlock", pF
16bc0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
16bd0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
16be0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
16bf0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
16c00 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16c10 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16c20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
16c30 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
16c40 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
16c50 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
16c60 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c    winUnlockReadL
16c70 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ock(pFile);.  }.
16c80 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
16c90 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
16ca0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
16cb0 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
16cc0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
16cd0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
16ce0 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
16cf0 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
16d00 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
16d10 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25  p, lock=%d, rc=%
16d20 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
16d30 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
16d40 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69  ->locktype, sqli
16d50 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
16d60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16d70 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
16d80 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20   is inititially 
16d90 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
16da0 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
16db0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
16dc0 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
16dd0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
16de0 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
16df0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
16e00 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
16e10 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
16e20 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
16e30 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
16e40 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
16e50 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
16e60 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28  void winModeBit(
16e70 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
16e80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
16e90 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
16ea0 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
16eb0 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
16ec0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
16ed0 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
16ee0 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
16ef0 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
16f00 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
16f10 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
16f20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
16f30 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
16f40 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
16f50 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
16f60 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
16f70 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
16f80 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63   files */.static
16f90 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
16fa0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
16fb0 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61  *, char **);.sta
16fc0 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
16fd0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a  (const void *);.
16fe0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
16ff0 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
17000 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  olon(const char 
17010 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72  *);../*.** Contr
17020 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20  ol and query of 
17030 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  the open file ha
17040 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
17050 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  int winFileContr
17060 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
17070 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
17080 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46  d *pArg){.  winF
17090 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
170a0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54  nFile*)id;.  OST
170b0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
170c0 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72  e=%p, op=%d, pAr
170d0 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  g=%p\n", pFile->
170e0 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20  h, op, pArg));. 
170f0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
17100 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
17110 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
17120 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
17130 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  Arg = pFile->loc
17140 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54  ktype;.      OST
17150 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
17160 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
17170 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
17180 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
171a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
171b0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
171c0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
171d0 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c   = (int)pFile->l
171e0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
171f0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
17200 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
17210 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
17220 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
17230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17240 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
17250 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
17260 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
17270 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
17280 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
17290 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
172a0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
172b0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
172c0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
172d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
172e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
172f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
17300 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
17310 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
17320 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  nk>0 ){.        
17330 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c  sqlite3_int64 ol
17340 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  dSz;.        int
17350 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
17360 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20  e(id, &oldSz);. 
17370 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17390 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
173a0 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71  t64 newSz = *(sq
173b0 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
173c0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  g;.          if(
173d0 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a   newSz>oldSz ){.
173e0 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
173f0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
17400 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(1);.          
17410 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
17420 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20  te(id, newSz);. 
17430 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
17440 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17450 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (0);.          }
17460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17470 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17480 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
17490 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
174a0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
174b0 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
174c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
174d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
174e0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
174f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
17500 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
17510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17520 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
17530 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
17540 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
17550 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
17560 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
17570 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
17580 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
17590 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
175a0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
175b0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
175c0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
175d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
175e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
175f0 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
17600 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
17610 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69  .      winModeBi
17620 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45  t(pFile, WINFILE
17630 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
17640 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
17650 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
17660 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
17670 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
17680 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
176a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
176b0 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
176c0 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
176d0 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
176e0 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20  intf("win32");. 
176f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
17700 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
17710 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
17720 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
17730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17740 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
17750 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
17760 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b  IN32_AV_RETRY: {
17770 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20  .      int *a = 
17780 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
17790 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a    if( a[0]>0 ){.
177a0 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
177b0 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
177c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
177d0 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65     a[0] = winIoe
177e0 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
177f0 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
17800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
17810 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
17820 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
17830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
17840 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72  ] = winIoerrRetr
17850 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a  yDelay;.      }.
17860 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17870 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17880 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17890 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
178a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
178b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
178c0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
178d0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
178e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
178f0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
17900 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
17910 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
17920 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
17930 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17950 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
17960 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
17970 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17980 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17990 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
179a0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
179b0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
179c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
179d0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
179e0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
179f0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
17a00 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
17a10 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
17a20 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
17a30 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
17a40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17a50 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
17a60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17a70 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
17a80 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
17a90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17aa0 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
17ab0 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
17ac0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
17ad0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
17ae0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
17af0 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
17b00 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
17b10 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
17b20 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
17b30 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
17b40 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
17b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
17b60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
17b70 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55  {.          winU
17b80 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
17b90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17ba0 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
17bb0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
17bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
17bd0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
17be0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
17bf0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
17c00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
17c10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
17c20 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
17c30 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
17c40 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17c50 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
17c60 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
17c70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17c80 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
17c90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17ca0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
17cb0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
17cc0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
17cd0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
17ce0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
17cf0 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
17d00 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
17d10 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
17d20 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
17d30 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
17d40 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
17d50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
17d60 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
17d70 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
17d80 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
17d90 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
17da0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
17db0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
17dc0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
17dd0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
17de0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
17df0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
17e00 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
17e10 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
17e20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
17e30 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
17e40 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
17e50 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
17e60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
17e70 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
17e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
17e90 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
17ea0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
17eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17ec0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
17ed0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
17ee0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
17ef0 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
17f00 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
17f10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
17f20 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
17f30 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
17f40 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
17f50 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
17f60 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
17f70 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
17f80 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  ;.}../* .** Wind
17f90 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
17fa0 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
17fb0 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
17fc0 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
17fd0 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
17fe0 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
17ff0 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
18000 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
18010 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
18020 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
18030 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
18040 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
18050 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
18060 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18070 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
18080 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
18090 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
180a0 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
180b0 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
180c0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
180d0 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
180e0 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
180f0 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
18100 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
18110 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
18120 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
18130 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
18140 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
18150 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
18160 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
18170 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
18180 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
18190 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
181a0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
181b0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
181c0 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
181d0 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
181e0 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
181f0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
18200 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
18210 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
18220 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
18230 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
18240 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
18250 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
18260 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
18270 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
18280 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
18290 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
182a0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
182b0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
182c0 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
182d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
182e0 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
182f0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
18300 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
18310 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
18320 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
18330 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
18340 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
18350 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
18360 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
18370 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
18380 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
18390 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
183a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
183b0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
183c0 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
183d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
183e0 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
183f0 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
18400 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
18410 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
18420 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
18430 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
18440 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
18450 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
18460 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
18470 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
18480 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
18490 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
184a0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
184b0 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
184c0 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
184d0 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
184e0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
184f0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
18500 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
18510 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
18520 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
18530 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
18540 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
18550 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
18560 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
18570 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
18580 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
18590 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
185a0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
185b0 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
185c0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
185d0 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
185e0 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
185f0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
18600 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
18610 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
18620 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
18630 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
18640 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
18650 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
18660 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
18670 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
18680 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
18690 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
186a0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
186b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
186c0 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
186d0 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
186e0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
186f0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
18700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
18710 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
18720 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
18730 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
18740 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
18750 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
18760 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
18770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18780 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
18790 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
187a0 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187c0 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
187d0 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
187e0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
187f0 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
18800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18810 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
18820 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
18830 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
18840 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
18850 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
18860 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
18870 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
18880 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
18890 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
188a0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
188c0 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
188d0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
188e0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
188f0 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
18900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
18910 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
18920 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
18930 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
18940 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
18950 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
18960 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
18970 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
18980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18990 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
189a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
189b0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
189c0 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
189d0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
189e0 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
189f0 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
18a00 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
18a10 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
18a20 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
18a30 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
18a40 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
18a50 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
18a60 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
18a70 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
18a80 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
18a90 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
18aa0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
18ab0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
18ac0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
18ad0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
18ae0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
18af0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
18b00 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
18b10 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
18b20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
18b30 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
18b40 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
18b50 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
18b60 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
18b70 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
18b80 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
18b90 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
18ba0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
18bb0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
18bc0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
18bd0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
18be0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
18bf0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
18c00 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
18c10 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
18c20 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
18c30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
18c40 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
18c50 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
18c60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
18c70 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
18c80 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
18c90 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
18ca0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
18cb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18cc0 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
18cd0 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
18ce0 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
18cf0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
18d00 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
18d10 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
18d20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
18d40 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
18d50 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
18d60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18d70 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
18da0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
18db0 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
18dc0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
18dd0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
18de0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
18df0 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
18e00 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
18e10 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
18e20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
18e30 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
18e40 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
18e50 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
18e60 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
18e70 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
18e80 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
18e90 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
18ea0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
18eb0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
18ec0 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
18ed0 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
18ee0 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
18ef0 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
18f00 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
18f10 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
18f20 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
18f30 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
18f40 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
18f50 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
18f60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
18f70 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
18f80 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
18f90 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
18fa0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
18fb0 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
18fc0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
18fd0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
18fe0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
18ff0 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
19000 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19020 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
19030 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
19040 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
19050 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19060 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
19070 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
19080 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
19090 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
190a0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
190b0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
190c0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
190d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
190e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
190f0 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
19100 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
19110 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
19120 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
19130 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ock=%d, offset=%
19140 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20  d, size=%d\n",. 
19150 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
19160 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79  >hFile.h, lockTy
19170 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29  pe, ofst, nByte)
19180 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
19190 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
191a0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
191b0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
191c0 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
191d0 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f      rc = winUnlo
191e0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
191f0 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c  File.h, ofst, 0,
19200 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65   nByte, 0);.  }e
19210 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
19220 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
19230 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
19240 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61  .    DWORD dwFla
19250 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
19260 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
19270 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
19280 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
19290 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
192a0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
192b0 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
192c0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
192d0 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
192e0 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  gs, ofst, 0, nBy
192f0 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20  te, 0);.  }.  . 
19300 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20   if( rc!= 0 ){. 
19310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
19320 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
19330 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
19340 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72   =  osGetLastErr
19350 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  or();.    rc = S
19360 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
19370 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
19380 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66  -LOCK file=%p, f
19390 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c  unc=%s, errno=%l
193a0 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  u, rc=%s\n",.   
193b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
193c0 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70  File.h, (lockTyp
193d0 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29  e == _SHM_UNLCK)
193e0 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c   ? "winUnlockFil
193f0 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  e" :.           
19400 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70  "winLockFile", p
19410 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
19420 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
19430 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rc)));..  return
19440 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
19450 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
19460 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
19470 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
19480 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
19490 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
194a0 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e  te3_file*,int,in
194b0 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
194c0 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65  winDelete(sqlite
194d0 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68  3_vfs *,const ch
194e0 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ar*,int);../*.**
194f0 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68   Purge the winSh
19500 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
19510 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
19520 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  th winShmNode.nR
19530 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
19540 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
19550 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
19560 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
19570 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
19580 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
19590 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
195a0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
195b0 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65  void winShmPurge
195c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
195d0 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  fs, int deleteFl
195e0 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ag){.  winShmNod
195f0 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d  e **pp;.  winShm
19600 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  Node *p;.  asser
19610 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
19620 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43  ld() );.  OSTRAC
19630 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69  E(("SHM-PURGE pi
19640 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61  d=%lu, deleteFla
19650 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g=%d\n",.       
19660 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
19670 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c  ProcessId(), del
19680 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20  eteFlag));.  pp 
19690 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  = &winShmNodeLis
196a0 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d  t;.  while( (p =
196b0 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20   *pp)!=0 ){.    
196c0 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
196d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
196e0 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65       if( p->mute
196f0 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74  x ){ sqlite3_mut
19700 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
19710 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69  ); }.      for(i
19720 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
19730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
19740 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d  BOOL bRc = osUnm
19750 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e  apViewOfFile(p->
19760 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29  aRegion[i].pMap)
19770 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
19780 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e  E(("SHM-PURGE-UN
19790 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  MAP pid=%lu, reg
197a0 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
197b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
197c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
197d0 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
197e0 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
197f0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
19800 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
19810 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
19820 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73      bRc = osClos
19830 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
19840 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
19850 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
19860 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70  HM-PURGE-CLOSE p
19870 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
19880 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
198a0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
198b0 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
198c0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
198d0 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45  );.        UNUSE
198e0 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
198f0 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (bRc);.      }. 
19900 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c       if( p->hFil
19910 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e  e.h!=NULL && p->
19920 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44  hFile.h!=INVALID
19930 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
19940 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
19950 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
19960 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c  );.        winCl
19970 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
19980 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a  e *)&p->hFile);.
19990 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
199a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
199b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
199c0 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29  if( deleteFlag )
199d0 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
199e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
199f0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
19a00 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
19a10 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
19a20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20  winDelete(pVfs, 
19a30 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  p->zFilename, 0)
19a40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19a50 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
19a60 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  ();.        Simu
19a70 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
19a80 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
19a90 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65      *pp = p->pNe
19aa0 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
19ab0 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f  3_free(p->aRegio
19ac0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
19ad0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
19ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d  else{.      pp =
19af0 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   &p->pNext;.    
19b00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  }.  }.}../*.** O
19b10 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d  pen the shared-m
19b20 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
19b30 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62  iated with datab
19b40 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a  ase file pDbFd..
19b50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
19b60 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
19b70 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
19b80 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
19b90 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
19ba0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
19bb0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
19bc0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
19bd0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
19be0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
19bf0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
19c00 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
19c10 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
19c20 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73  er cleared..*/.s
19c30 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
19c40 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69  nSharedMemory(wi
19c50 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  nFile *pDbFd){. 
19c60 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a   struct winShm *
19c70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
19c80 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
19c90 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
19ca0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  ed */.  struct w
19cb0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
19cc0 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ode = 0;   /* Th
19cd0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
19ce0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
19cf0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19d20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
19d30 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20  ShmNode *pNew;  
19d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
19d50 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53  y allocated winS
19d60 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  hmNode */.  int 
19d70 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d90 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20  * Size of zName 
19da0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61  in bytes */..  a
19db0 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
19dc0 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  hm==0 );    /* N
19dd0 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  ot previously op
19de0 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ened */..  /* Al
19df0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19e00 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33   the new sqlite3
19e10 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c  _shm object.  Al
19e20 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79  so speculatively
19e30 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73  .  ** allocate s
19e40 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77  pace for a new w
19e50 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69  inShmNode and fi
19e60 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70  lename..  */.  p
19e70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
19e80 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29  Zero( sizeof(*p)
19e90 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
19ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
19eb0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e  OERR_NOMEM;.  nN
19ec0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
19ed0 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61  len30(pDbFd->zPa
19ee0 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  th);.  pNew = sq
19ef0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
19f00 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
19f10 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20  e) + nName + 17 
19f20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
19f30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
19f40 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
19f50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19f60 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e  _NOMEM;.  }.  pN
19f70 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
19f80 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
19f90 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
19fa0 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
19fb0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
19fc0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
19fd0 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
19fe0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
19ff0 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
1a000 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20  >zFilename); .. 
1a010 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
1a020 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
1a030 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
1a040 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
1a050 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
1a060 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
1a070 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
1a080 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
1a090 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
1a0a0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1a0b0 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
1a0c0 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
1a0d0 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
1a0e0 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
1a0f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
1a100 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
1a110 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
1a120 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
1a130 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
1a140 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
1a150 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
1a160 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a170 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1a180 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1a190 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
1a1a0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
1a1b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
1a1c0 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
1a1d0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1a1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
1a1f0 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
1a200 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
1a210 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
1a220 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
1a230 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
1a240 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
1a250 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
1a260 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
1a270 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
1a280 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
1a290 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
1a2a0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
1a2b0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1a2c0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
1a2d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1a2e0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1a2f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1a300 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1a310 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1a320 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
1a330 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
1a340 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
1a350 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1a360 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
1a370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1a380 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
1a390 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
1a3a0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1a3b0 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
1a3c0 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
1a3d0 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1a3e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a3f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1a400 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
1a410 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1a420 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1a430 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a440 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
1a450 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1a460 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1a470 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1a480 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1a490 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1a4a0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1a4b0 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1a4c0 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
1a4d0 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
1a4e0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1a4f0 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
1a500 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79      if( winShmSy
1a510 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1a520 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57  e, _SHM_WRLCK, W
1a530 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IN_SHM_DMS, 1)==
1a540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a550 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1a560 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
1a570 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
1a580 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  File, 0);.      
1a590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a5a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1a5b0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1a5c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
1a5d0 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  EN, osGetLastErr
1a5e0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a600 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62  winOpenShm", pDb
1a610 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1a620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a640 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53  ){.      winShmS
1a650 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1a660 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
1a670 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
1a680 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
1a690 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1a6a0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
1a6b0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1a6c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1a6d0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
1a6e0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
1a6f0 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
1a700 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
1a710 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ild of the winSh
1a720 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
1a730 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
1a740 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
1a750 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
1a760 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
1a770 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
1a780 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
1a790 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
1a7a0 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65   = p;.  winShmLe
1a7b0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
1a7c0 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
1a7d0 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
1a7e0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1a7f0 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
1a800 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
1a810 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ver of the winSh
1a820 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  mEnterMutex() mu
1a830 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
1a840 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
1a850 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69  * new (struct wi
1a860 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  nShm) object to 
1a870 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
1a880 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
1a890 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
1a8a0 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
1a8b0 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
1a8c0 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
1a8d0 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
1a8e0 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
1a8f0 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
1a900 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
1a910 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
1a920 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
1a930 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
1a940 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a950 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1a960 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
1a970 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
1a980 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
1a990 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
1a9a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a9b0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1a9c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1a9d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1a9e0 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
1a9f0 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
1aa00 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
1aa10 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1aa20 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1aa30 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1aa40 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28  ;.  winShmPurge(
1aa50 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b  pDbFd->pVfs, 0);
1aa60 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1aa70 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
1aa80 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
1aa90 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1aaa0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
1aab0 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53  ee(pNew);.  winS
1aac0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1aad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aae0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
1aaf0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
1ab00 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
1ab10 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
1ab20 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
1ab30 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
1ab40 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
1ab50 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
1ab60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1ab70 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1ab80 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1ab90 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1aba0 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
1abb0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
1abc0 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
1abd0 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
1abe0 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1abf0 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
1ac00 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1ac10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1ac20 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
1ac30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ac40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1ac50 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
1ac60 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1ac70 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
1ac80 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
1ac90 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
1aca0 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
1acb0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1acc0 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
1acd0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
1ace0 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
1acf0 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
1ad00 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
1ad10 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1ad20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
1ad30 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1ad40 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
1ad50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
1ad60 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
1ad70 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
1ad80 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
1ad90 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
1ada0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1adb0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1adc0 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
1add0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
1ade0 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
1adf0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
1ae00 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1ae10 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1ae20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
1ae30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ae40 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
1ae50 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1ae60 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1ae70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
1ae80 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
1ae90 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
1aea0 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
1aeb0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
1aec0 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
1aed0 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
1aee0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1aef0 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1af00 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1af10 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1af20 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1af30 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1af40 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
1af50 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
1af60 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
1af70 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1af80 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
1af90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1afa0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1afb0 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1afc0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1afd0 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
1afe0 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
1aff0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1b000 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1b010 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1b020 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1b030 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1b040 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1b050 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1b060 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
1b070 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1b080 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0a0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
1b0b0 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1b0c0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
1b0d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1b0e0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1b0f0 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
1b100 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
1b110 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1b120 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
1b130 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
1b140 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1b150 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1b160 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1b170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b180 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
1b190 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
1b1a0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
1b1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b1d0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1b1e0 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
1b1f0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1b200 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1b210 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1b220 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b240 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1b250 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b270 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1b280 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
1b290 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
1b2a0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
1b2b0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
1b2c0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1b2d0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1b2e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
1b2f0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1b300 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1b310 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1b320 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1b330 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1b340 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1b350 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
1b360 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1b370 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1b380 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1b390 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1b3a0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1b3b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1b3c0 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
1b3d0 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
1b3e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1b3f0 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
1b400 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
1b410 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
1b420 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
1b430 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
1b440 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
1b450 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
1b460 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1b470 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1b480 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1b490 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1b4a0 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
1b4b0 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
1b4c0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
1b4d0 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
1b4e0 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
1b4f0 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
1b500 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
1b510 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1b520 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1b530 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1b540 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1b550 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1b560 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
1b570 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
1b580 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
1b590 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
1b5a0 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
1b5b0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1b5c0 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
1b5d0 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1b5e0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1b5f0 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
1b600 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
1b610 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1b620 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1b630 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
1b640 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1b650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b670 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
1b680 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
1b690 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1b6a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b6b0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
1b6c0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1b6d0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1b6e0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1b6f0 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
1b700 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1b710 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
1b720 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
1b730 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
1b740 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
1b750 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
1b760 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
1b770 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
1b780 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
1b790 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
1b7a0 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
1b7b0 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
1b7c0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
1b7d0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
1b7e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1b7f0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
1b800 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
1b810 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
1b820 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1b830 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1b840 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1b850 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
1b860 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
1b870 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1b880 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1b890 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
1b8b0 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
1b8c0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
1b8d0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
1b8e0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
1b8f0 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
1b900 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
1b910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1b930 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
1b940 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
1b950 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1b960 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1b970 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73   _SHM_RDLCK, ofs
1b980 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1b990 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1b9a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b9b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1b9c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1b9d0 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
1b9e0 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
1b9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
1ba10 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
1ba20 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
1ba30 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
1ba40 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
1ba50 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
1ba60 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
1ba70 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
1ba80 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
1ba90 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
1baa0 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
1bab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1bac0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1bad0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1bae0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1baf0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1bb00 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
1bb10 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
1bb20 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1bb30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bb40 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1bb50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1bb60 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
1bb70 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
1bb80 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
1bb90 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
1bba0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
1bbb0 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
1bbc0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
1bbd0 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
1bbe0 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
1bbf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bc00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1bc10 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1bc20 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1bc30 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _WRLCK, ofst+WIN
1bc40 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1bc50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1bc60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bc70 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
1bc80 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
1bc90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1bca0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
1bcb0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
1bcc0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
1bcd0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1bce0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bcf0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1bd00 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25  CK pid=%lu, id=%
1bd10 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30  d, sharedMask=%0
1bd20 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33  3x, exclMask=%03
1bd30 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  x, rc=%s\n",.   
1bd40 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1bd50 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1bd60 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65   p->id, p->share
1bd70 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
1bd80 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  sk,.           s
1bd90 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1bda0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
1bdb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1bdc0 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
1bdd0 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
1bde0 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
1bdf0 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
1be00 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
1be10 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
1be20 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
1be30 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
1be40 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
1be50 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
1be60 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
1be70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1be80 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20  winShmBarrier(. 
1be90 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1bea0 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  d          /* Da
1beb0 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
1bec0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1bed0 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
1bee0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1bef0 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65   /* MemoryBarrie
1bf00 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74  r(); // does not
1bf10 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20   work -- do not 
1bf20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a  know why not */.
1bf30 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1bf40 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  ex();.  winShmLe
1bf50 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
1bf60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bf70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1bf80 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
1bf90 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
1bfa0 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
1bfb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
1bfc0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1bfd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
1bfe0 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
1bff0 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
1c000 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
1c010 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
1c020 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
1c030 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
1c040 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
1c050 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
1c060 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1c070 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1c080 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1c090 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
1c0a0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1c0b0 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74  e, if the isWrit
1c0c0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  e parameter is 0
1c0d0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1c0e0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1c0f0 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
1c100 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1c110 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
1c120 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
1c130 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
1c140 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1c150 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
1c160 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
1c170 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1c180 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74  d. If .** isWrit
1c190 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
1c1a0 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1c1b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1c1c0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
1c1d0 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
1c1e0 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
1c1f0 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
1c200 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1c210 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
1c220 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
1c230 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
1c240 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
1c250 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
1c260 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
1c270 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
1c280 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
1c290 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
1c2a0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
1c2b0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1c2c0 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
1c2d0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1c2e0 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
1c2f0 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
1c300 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
1c310 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1c320 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
1c330 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1c340 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1c350 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
1c360 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1c370 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c390 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
1c3a0 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
1c3b0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1c3c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1c3d0 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
1c3e0 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20  int isWrite,    
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
1c410 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
1c420 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
1c430 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
1c440 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1c450 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
1c460 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1c470 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1c480 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a  *)fd;.  winShm *
1c490 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1c4a0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1c4b0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1c4c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1c4d0 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
1c4e0 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72  rc = winOpenShar
1c4f0 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
1c500 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c510 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1c520 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46  rc;.    p = pDbF
1c530 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70  d->pShm;.  }.  p
1c540 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1c550 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65  mNode;..  sqlite
1c560 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1c570 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c580 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
1c590 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
1c5a0 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
1c5b0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
1c5c0 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
1c5d0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1c5e0 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ion ){.    struc
1c5f0 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e  t ShmRegion *apN
1c600 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
1c610 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61   New aRegion[] a
1c620 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
1c630 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e  nByte = (iRegion
1c640 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f  +1)*szRegion;  /
1c650 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72  * Minimum requir
1c660 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
1c670 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1c680 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  4 sz;           
1c690 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1c6a0 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e  t size of wal-in
1c6b0 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  dex file */..   
1c6c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
1c6d0 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
1c6e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1c6f0 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
1c700 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
1c710 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1c720 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
1c730 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
1c740 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
1c750 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
1c760 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
1c770 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  x file is.    **
1c780 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1c790 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
1c7a0 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
1c7b0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1c7c0 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c  winFileSize((sql
1c7d0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1c7e0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73  mNode->hFile, &s
1c7f0 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  z);.    if( rc!=
1c800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c810 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1c820 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1c830 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
1c840 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c     "winShmMap1",
1c870 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1c880 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1c890 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
1c8a0 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
1c8b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1c8c0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1c8d0 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
1c8e0 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
1c8f0 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
1c900 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
1c910 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
1c920 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
1c930 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1c940 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
1c950 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
1c960 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
1c970 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
1c980 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
1c990 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
1c9a0 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
1c9b0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1c9c0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1c9d0 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
1c9e0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1c9f0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
1ca00 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
1ca10 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
1ca20 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
1ca30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1ca40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ca50 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1ca60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1ca70 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1ca80 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1cab0 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map2", pDbFd->zP
1cac0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ath);.        go
1cad0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1caf0 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
1cb00 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1cb10 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
1cb20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1cb30 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
1cb40 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20  apNew = (struct 
1cb50 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69  ShmRegion *)sqli
1cb60 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
1cb70 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
1cb80 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
1cb90 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77  +1)*sizeof(apNew
1cba0 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  [0]).    );.    
1cbb0 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
1cbc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cbd0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1cbe0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1cbf0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
1cc00 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1cc10 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77   = apNew;..    w
1cc20 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
1cc30 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1cc40 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45   ){.      HANDLE
1cc50 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20   hMap = NULL;   
1cc60 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61        /* file-ma
1cc70 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a  pping handle */.
1cc80 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70        void *pMap
1cc90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1cca0 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f    /* Mapped memo
1ccb0 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20  ry region */.   
1ccc0 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53    .#if SQLITE_OS
1ccd0 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61  _WINRT.      hMa
1cce0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1ccf0 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70  MappingFromApp(p
1cd00 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1cd10 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1cd20 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1cd30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1cd40 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1cd50 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1cd60 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
1cd70 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1cd80 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53  eFileMappingW(pS
1cd90 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1cda0 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c   .          NULL
1cdb0 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1cdc0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1cdd0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1cde0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1cdf0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
1ce00 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1ce10 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1ce20 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1ce30 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
1ce40 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1ce50 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
1ce60 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e  ULL.      );.#en
1ce70 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
1ce80 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41  E(("SHM-MAP-CREA
1ce90 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  TE pid=%lu, regi
1cea0 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20  on=%d, size=%d, 
1ceb0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1cec0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ced0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1cee0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1cef0 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
1cf00 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
1cf10 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1cf20 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
1cf30 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
1cf40 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
1cf50 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
1cf60 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
1cf70 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
1cf80 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
1cf90 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1cfa0 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1cfb0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
1cfc0 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d  WINRT.        pM
1cfd0 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
1cfe0 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70  FileFromApp(hMap
1cff0 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
1d000 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
1d010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  ,.            iO
1d020 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
1d030 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
1d040 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
1d050 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
1d060 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73         pMap = os
1d070 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d  MapViewOfFile(hM
1d080 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
1d090 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
1d0a0 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
1d0b0 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66  0, iOffset - iOf
1d0c0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
1d0d0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
1d0e0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
1d0f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54  ndif.        OST
1d100 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d  RACE(("SHM-MAP-M
1d110 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69  AP pid=%lu, regi
1d120 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64  on=%d, offset=%d
1d130 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
1d140 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d150 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1d160 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1d170 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d180 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  , iOffset,.     
1d190 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65              szRe
1d1a0 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b  gion, pMap ? "ok
1d1b0 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1d1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d1d0 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20  ( !pMap ){.     
1d1e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73     pShmNode->las
1d1f0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1d200 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1d210 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1d220 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1d230 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64  _SHMMAP, pShmNod
1d240 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1d270 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p3", pDbFd->zPat
1d280 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  h);.        if( 
1d290 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61  hMap ) osCloseHa
1d2a0 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
1d2b0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1d2c0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1d2d0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
1d2e0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
1d2f0 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
1d300 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
1d310 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
1d320 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d330 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
1d340 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
1d350 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
1d360 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
1d370 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
1d380 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
1d390 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  n ){.    int iOf
1d3a0 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73  fset = iRegion*s
1d3b0 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  zRegion;.    int
1d3c0 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
1d3d0 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
1d3e0 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
1d3f0 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20  nGranularity;.  
1d400 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
1d410 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
1d420 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
1d430 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
1d440 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
1d450 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
1d460 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
1d470 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1d480 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1d490 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1d4a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1d4b0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1d4c0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
1d4d0 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
1d4e0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
1d4f0 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
1d500 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
1d510 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
1d520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d530 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
1d540 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d   Cleans up the m
1d550 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20  apped region of 
1d560 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1d570 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  le, if any..*/.#
1d580 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1d590 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
1d5a0 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c   int winUnmapfil
1d5b0 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
1d5c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ){.  assert( pFi
1d5d0 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  le!=0 );.  OSTRA
1d5e0 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
1d5f0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1d600 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70  p, hMap=%p, pMap
1d610 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
1d620 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a          "mmapSiz
1d630 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  e=%lld, mmapSize
1d640 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61  Actual=%lld, mma
1d650 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22  pSizeMax=%lld\n"
1d660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1d670 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1d680 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
1d690 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d  le->hMap, pFile-
1d6a0 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20  >pMapRegion,.   
1d6b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1d6c0 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e  mapSize, pFile->
1d6d0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20  mmapSizeActual, 
1d6e0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1d6f0 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ax));.  if( pFil
1d700 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  e->pMapRegion ){
1d710 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61  .    if( !osUnma
1d720 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
1d730 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29  e->pMapRegion) )
1d740 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1d750 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1d760 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1d770 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1d780 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1d790 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52   pFile=%p, pMapR
1d7a0 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1d7b0 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53             "rc=S
1d7c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1d7d0 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e  \n", osGetCurren
1d7e0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1d7f0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
1d800 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1d810 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72  egion));.      r
1d820 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
1d830 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1d840 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  MAP, pFile->last
1d850 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c  "winUnmapfile1",
1d880 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1d890 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1d8a0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
1d8b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
1d8c0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
1d8d0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
1d8e0 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ual = 0;.  }.  i
1d8f0 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d  f( pFile->hMap!=
1d900 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  NULL ){.    if( 
1d910 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70  !osCloseHandle(p
1d920 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20  File->hMap) ){. 
1d930 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
1d940 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1d950 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1d960 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1d970 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1d980 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
1d990 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1d9a0 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20  _MMAP\n",.      
1d9b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d9c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d9d0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
1d9e0 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65  hMap));.      re
1d9f0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1da00 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1da10 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1da20 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1da40 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20  winUnmapfile2", 
1da50 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1da60 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1da70 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  hMap = NULL;.  }
1da80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d  .  OSTRACE(("UNM
1da90 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1daa0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1dab0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
1dac0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1dad0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1dae0 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72  pFile));.  retur
1daf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1db00 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70  /*.** Memory map
1db10 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69   or remap the fi
1db20 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c  le opened by fil
1db30 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  e-descriptor pFd
1db40 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a   (if the file.**
1db50 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70   is already mapp
1db60 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67  ed, the existing
1db70 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c   mapping is repl
1db80 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29  aced by the new)
1db90 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65  . Or, if .** the
1dba0 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
1dbb0 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20  s a mapping for 
1dbc0 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74  this file, and t
1dbd0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a  here are still .
1dbe0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  ** outstanding x
1dbf0 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63  Fetch() referenc
1dc00 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66  es to it, this f
1dc10 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1dc20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  op..**.** If par
1dc30 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20  ameter nByte is 
1dc40 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68  non-negative, th
1dc50 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71  en it is the req
1dc60 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a  uested size of .
1dc70 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
1dc80 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
1dc90 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
1dca0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
1dcb0 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65   then the .** re
1dcc0 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20  quested size is 
1dcd0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1dce0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68  file on disk. Th
1dcf0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
1dd00 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   the.** created 
1dd10 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65  mapping is eithe
1dd20 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
1dd30 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75  size or the valu
1dd40 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a  e configured .**
1dd50 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
1dd60 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77  NTL_MMAP_SIZE, w
1dd70 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
1dd80 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
1dd90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dda0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1ddb0 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
1ddc0 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
1ddd0 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
1dde0 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
1ddf0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1de00 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
1de10 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
1de20 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1de30 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69  tic int winMapfi
1de40 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c  le(winFile *pFd,
1de50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1de60 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Byte){.  sqlite3
1de70 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42  _int64 nMap = nB
1de80 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  yte;.  int rc;..
1de90 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
1dea0 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
1deb0 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52  Out==0 );.  OSTR
1dec0 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
1ded0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1dee0 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a  , size=%lld\n",.
1def0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1df00 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1df10 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29  (), pFd, nByte))
1df20 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  ;..  if( pFd->nF
1df30 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
1df40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1df50 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
1df60 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
1df70 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
1df80 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a  e*)pFd, &nMap);.
1df90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1dfa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1dfb0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1dfc0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1dfd0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c  ITE_IOERR_FSTAT\
1dfe0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1dff0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1e000 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
1e010 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e020 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1e030 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AT;.    }.  }.  
1e040 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
1e050 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
1e060 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
1e070 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20  pSizeMax;.  }.  
1e080 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65  nMap &= ~(sqlite
1e090 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49  3_int64)(winSysI
1e0a0 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d  nfo.dwPageSize -
1e0b0 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e 4d 61   1);. .  if( nMa
1e0c0 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61  p==0 && pFd->mma
1e0d0 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77  pSize>0 ){.    w
1e0e0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
1e0f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
1e100 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
1e110 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
1e120 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44  w = 0;.    DWORD
1e130 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
1e140 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57  READONLY;.    DW
1e150 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45  ORD flags = FILE
1e160 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20  _MAP_READ;..    
1e170 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1e180 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d  );.    if( (pFd-
1e190 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
1e1a0 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
1e1b0 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74  ){.      protect
1e1c0 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54   = PAGE_READWRIT
1e1d0 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  E;.      flags |
1e1e0 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  = FILE_MAP_WRITE
1e1f0 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1e200 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1e210 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1e220 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
1e230 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e  romApp(pFd->h, N
1e240 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d  ULL, protect, nM
1e250 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  ap, NULL);.#elif
1e260 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e270 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1e280 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1e290 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1e2a0 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  ingW(pFd->h, NUL
1e2b0 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20  L, protect,.    
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1e2e0 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26  RD)((nMap>>32) &
1e2f0 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20   0xffffffff),.  
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1e320 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66  WORD)(nMap & 0xf
1e330 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b  fffffff), NULL);
1e340 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1e350 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1e360 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68  ANSI).    pFd->h
1e370 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1e380 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e  leMappingA(pFd->
1e390 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1e3a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
1e3d0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
1e3e0 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
1e410 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
1e420 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
1e430 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d    if( pFd->hMap=
1e440 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
1e450 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
1e460 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1e470 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1e480 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e490 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
1e4a0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4c0 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22     "winMapfile1"
1e4d0 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
1e4e0 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
1e4f0 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
1e500 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
1e510 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
1e520 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
1e530 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1e540 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25  ILE-CREATE pid=%
1e550 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1e560 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e570 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1e580 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e590 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
1e5a0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1e5b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e5c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
1e5d0 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
1e5e0 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1e5f0 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ze)==0 );.    as
1e600 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a  sert( sizeof(SIZ
1e610 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c  E_T)==sizeof(sql
1e620 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e  ite3_int64) || n
1e630 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20  Map<=0xffffffff 
1e640 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
1e650 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
1e660 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1e670 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
1e680 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53  ap, flags, 0, (S
1e690 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c  IZE_T)nMap);.#el
1e6a0 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
1e6b0 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
1e6c0 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
1e6d0 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  0, 0, (SIZE_T)nM
1e6e0 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ap);.#endif.    
1e6f0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
1e700 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
1e710 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29  andle(pFd->hMap)
1e720 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61  ;.      pFd->hMa
1e730 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  p = NULL;.      
1e740 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
1e750 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1e760 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1e770 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1e780 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
1e790 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32      "winMapfile2
1e7c0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
1e7d0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
1e7e0 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
1e7f0 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
1e800 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
1e810 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
1e820 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1e830 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
1e840 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
1e850 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1e860 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e870 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1e880 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
1e890 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1e8a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e8b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
1e8c0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
1e8d0 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
1e8e0 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
1e8f0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
1e900 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
1e910 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ..  OSTRACE(("MA
1e920 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1e930 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1e940 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1e950 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1e960 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e970 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Fd));.  return S
1e980 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1e990 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
1e9a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
1e9b0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
1e9c0 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
1e9d0 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
1e9e0 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
1e9f0 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
1ea00 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
1ea10 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
1ea20 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
1ea30 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
1ea40 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
1ea50 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
1ea60 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
1ea70 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
1ea80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
1ea90 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
1eaa0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1eab0 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
1eac0 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
1ead0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
1eae0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
1eaf0 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
1eb00 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1eb10 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
1eb20 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
1eb30 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
1eb40 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1eb50 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
1eb60 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
1eb70 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
1eb80 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
1eb90 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61  tually .** relea
1eba0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
1ebb0 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55   by calling winU
1ebc0 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61  nfetch()..*/.sta
1ebd0 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68  tic int winFetch
1ebe0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
1ebf0 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74  d, i64 iOff, int
1ec00 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70   nAmt, void **pp
1ec10 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
1ec20 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1ec30 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  winFile *pFd = (
1ec40 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f  winFile*)fd;   /
1ec50 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1ec60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1ec70 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d  /.#endif.  *pp =
1ec80 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   0;..  OSTRACE((
1ec90 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
1eca0 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74  pFile=%p, offset
1ecb0 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64  =%lld, amount=%d
1ecc0 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  , pp=%p\n",.    
1ecd0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1ece0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ecf0 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20  fd, iOff, nAmt, 
1ed00 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pp));..#if SQLIT
1ed10 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1ed20 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
1ed30 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
1ed40 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
1ed50 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
1ed60 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61    int rc = winMa
1ed70 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a  pfile(pFd, -1);.
1ed80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ed90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1eda0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54     OSTRACE(("FET
1edb0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1edc0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%p, rc=%s\n",.
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1edf0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73  cessId(), pFd, s
1ee00 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1ee10 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
1ee20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ee30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1ee40 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69  d->mmapSize >= i
1ee50 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20  Off+nAmt ){.    
1ee60 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29    *pp = &((u8 *)
1ee70 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
1ee80 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46  [iOff];.      pF
1ee90 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a  d->nFetchOut++;.
1eea0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1eeb0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45  ..  OSTRACE(("FE
1eec0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1eed0 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70  le=%p, pp=%p, *p
1eee0 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  p=%p, rc=SQLITE_
1eef0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1ef00 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1ef10 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70  ocessId(), fd, p
1ef20 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75  p, *pp));.  retu
1ef30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ef40 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  ./*.** If the th
1ef50 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
1ef60 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  non-NULL, then t
1ef70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c  his function rel
1ef80 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65  eases a .** refe
1ef90 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62  rence obtained b
1efa0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
1efb0 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e  l to winFetch().
1efc0 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
1efd0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1efe0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1eff0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
1f000 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
1f010 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
1f020 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
1f030 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63  d to the winFetc
1f040 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  h() invocation. 
1f050 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
1f060 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
1f070 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
1f080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f090 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a  being called .**
1f0a0 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
1f0b0 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
1f0c0 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
1f0d0 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
1f0e0 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20  mapping .** may 
1f0f0 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61  now be invalid a
1f100 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d  nd should be unm
1f110 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  apped..*/.static
1f120 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28   int winUnfetch(
1f130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1f140 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
1f150 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
1f160 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1f170 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
1f180 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1f190 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1f1a0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1f1b0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d  e */..  /* If p=
1f1c0 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e  =0 (unmap the en
1f1d0 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20  tire file) then 
1f1e0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  there must be no
1f1f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20   outstanding .  
1f200 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ** xFetch refere
1f210 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d  nces. Or, if p!=
1f220 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  0 (meaning it is
1f230 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72   an xFetch refer
1f240 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  ence),.  ** then
1f250 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
1f260 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
1f270 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  tanding.  */.  a
1f280 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28  ssert( (p==0)==(
1f290 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
1f2a0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  0) );..  /* If p
1f2b0 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74  !=0, it must mat
1f2c0 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75  ch the iOff valu
1f2d0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
1f2e0 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38  p==0 || p==&((u8
1f2f0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
1f300 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20  on)[iOff] );..  
1f310 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
1f320 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1f330 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
1f340 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  , p=%p\n",.     
1f350 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f360 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f370 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a  Fd, iOff, p));..
1f380 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
1f390 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
1f3a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f3b0 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64   FIXME:  If Wind
1f3c0 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73  ows truly always
1f3d0 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61   prevents trunca
1f3e0 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67  ting or deleting
1f3f0 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77   a.    ** file w
1f400 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69  hile a mapping i
1f410 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65  s held, then the
1f420 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e   following winUn
1f430 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20  mapfile() call. 
1f440 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73     ** is unneces
1f450 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62 65 20  sary can can be 
1f460 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74  omitted - potent
1f470 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a  ially improving.
1f480 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e      ** performan
1f490 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55  ce.  */.    winU
1f4a0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1f4b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
1f4c0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
1f4d0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54  );.#endif..  OST
1f4e0 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70  RACE(("UNFETCH p
1f4f0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1f500 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1f510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1f520 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f530 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72  sId(), fd));.  r
1f540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
1f560 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
1f570 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
1f580 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
1f590 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
1f5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1f5b0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
1f5c0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1f5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1f5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f630 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
1f640 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
1f650 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
1f660 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
1f670 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69  te on an.** sqli
1f680 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e  te3_file for win
1f690 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  32..*/.static co
1f6a0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
1f6b0 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68  ethods winIoMeth
1f6c0 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20  od = {.  3,     
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
1f6f0 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f  sion */.  winClo
1f700 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1f710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1f720 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64  ose */.  winRead
1f730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
1f750 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c  d */.  winWrite,
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
1f780 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74   */.  winTruncat
1f790 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f7a0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
1f7b0 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c  te */.  winSync,
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
1f7e0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a   */.  winFileSiz
1f7f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f800 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
1f810 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c  ze */.  winLock,
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
1f840 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c   */.  winUnlock,
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
1f870 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65   */.  winCheckRe
1f880 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
1f890 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
1f8a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
1f8b0 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c   winFileControl,
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
1f8e0 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53   */.  winSectorS
1f8f0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1f900 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
1f910 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76  Size */.  winDev
1f920 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f930 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65  cs,       /* xDe
1f940 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f950 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d  ics */.  winShmM
1f960 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
1f970 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1f980 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c  Map */.  winShmL
1f990 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1f9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1f9b0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  Lock */.  winShm
1f9c0 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
1f9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1f9e0 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69  mBarrier */.  wi
1f9f0 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  nShmUnmap,      
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa10 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20   xShmUnmap */.  
1fa20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20  winFetch,       
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77  /* xFetch */.  w
1fa50 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20  inUnfetch       
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa70 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b  * xUnfetch */.};
1fa80 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1fa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1faa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1fad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
1faf0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
1fb00 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1fb10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1fb20 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
1fb30 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
1fb40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1fb50 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
1fb60 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
1fb70 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 30  bject..*/..#if 0
1fb80 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1fb90 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
1fba0 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
1fbb0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
1fbc0 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
1fbd0 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
1fbe0 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
1fbf0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1fc00 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
1fc10 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1fc20 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
1fc30 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1fc40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
1fc50 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
1fc60 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
1fc70 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
1fc80 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
1fc90 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
1fca0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
1fcb0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
1fcc0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
1fcd0 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
1fce0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
1fcf0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1fd00 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1fd10 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
1fd20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
1fd30 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c  bcs_to_utf8(zFil
1fd40 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
1fd50 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
1fd60 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
1fd70 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
1fd80 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
1fd90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1fda0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
1fdb0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
1fdc0 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
1fdd0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
1fde0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1fdf0 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
1fe00 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
1fe10 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
1fe20 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1fe30 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
1fe40 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
1fe50 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
1fe60 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1fe70 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
1fe80 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
1fe90 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
1fea0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
1feb0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
1fec0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
1fed0 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
1fee0 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
1fef0 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
1ff00 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
1ff10 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1ff20 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
1ff30 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
1ff40 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
1ff50 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
1ff60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1ff70 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
1ff80 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
1ff90 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
1ffa0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
1ffb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ffc0 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
1ffd0 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
1ffe0 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
1fff0 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
20000 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
20010 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
20020 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
20030 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
20040 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
20050 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
20060 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
20070 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
20080 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
20090 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
200a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
200b0 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
200c0 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
200d0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
200e0 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
200f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
20100 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
20110 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
20120 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
20130 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
20140 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
20150 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
20160 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
20170 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
20180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20190 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
201a0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
201b0 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
201c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
201d0 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
201e0 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
201f0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
20200 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
20210 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
20220 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
20230 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
20240 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
20250 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
20260 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
20270 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
20280 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
20290 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
202a0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
202b0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
202c0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
202d0 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
202e0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 42 75 66  i, j;.  int nBuf
202f0 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a  , nLen;.  char *
20300 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zBuf;..  /* It's
20310 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
20320 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
20330 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
20340 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
20350 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
20360 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
20370 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
20380 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
20390 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
203a0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
203b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
203c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
203d0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20  _IOERR );..  /* 
203e0 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f  Allocate a tempo
203f0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73  rary buffer to s
20400 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71  tore the fully q
20410 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20  ualified file.  
20420 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ** name for the 
20430 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
20440 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
20450 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e  we cannot contin
20460 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 42 75 66 20  ue..  */.  nBuf 
20470 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
20480 6d 65 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c  me;.  zBuf = sql
20490 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
204a0 6e 42 75 66 2b 33 20 29 3b 0a 20 20 69 66 28 20  nBuf+3 );.  if( 
204b0 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54  !zBuf ){.    OST
204c0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
204d0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
204e0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
204f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20500 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
20510 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
20520 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69   out the effecti
20530 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  ve temporary dir
20540 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20  ectory.  First, 
20550 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a  check if one.  *
20560 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69  * has been expli
20570 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68 65  citly set by the
20580 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74   application; ot
20590 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
205a0 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   one.  ** config
205b0 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65 72  ured by the oper
205c0 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20  ating system..  
205d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75  */.  assert( nBu
205e0 66 3e 33 30 20 29 3b 0a 20 20 69 66 28 20 73 71  f>30 );.  if( sq
205f0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
20600 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  tory ){.    sqli
20610 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
20620 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 22  f-30, zBuf, "%s"
20630 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
20640 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 77  irectory);.    w
20650 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
20660 70 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 29  p(nBuf-30, zBuf)
20670 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  ;.  }.#if define
20680 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
20690 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
206a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
206b0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  irs[] = {.      
206c0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53   0, /* getenv("S
206d0 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a  QLITE_TMPDIR") *
206e0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
206f0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20  etenv("TMPDIR") 
20700 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
20710 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f  getenv("TMP") */
20720 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
20730 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a  tenv("TEMP") */.
20740 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
20750 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
20760 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76  ") */.       "/v
20770 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  ar/tmp",.       
20780 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
20790 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
207a0 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20    ".",.       0 
207b0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
207c0 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20  erminator */.   
207d0 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   };.    unsigned
207e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
207f0 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
20800 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  ;..    if( !azDi
20810 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
20820 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
20830 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  TE_TMPDIR");.   
20840 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
20850 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
20860 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
20870 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
20880 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
20890 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a   getenv("TMP");.
208a0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
208b0 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d  3] ) azDirs[3] =
208c0 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b   getenv("TEMP");
208d0 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
208e0 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20  [4] ) azDirs[4] 
208f0 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
20900 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72  OFILE");.    for
20910 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
20920 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
20930 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
20940 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
20950 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
20960 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ted;.      if( z
20970 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
20980 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e;.      /* If t
20990 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77  he path starts w
209a0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
209b0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  er followed by t
209c0 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a  he colon.      *
209d0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73  * character, ass
209e0 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64  ume it is alread
209f0 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  y a native Win32
20a00 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65   path; otherwise
20a10 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75  ,.      ** it mu
20a20 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  st be converted 
20a30 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  to a native Win3
20a40 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43  2 path via the C
20a50 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20  ygwin API.      
20a60 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e  ** prior to usin
20a70 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  g it..      */. 
20a80 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72       if( winIsDr
20a90 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
20aa0 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  n(zDir) ){.     
20ab0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20ac0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
20ad0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29  f8Filename(zDir)
20ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
20af0 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
20b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20b10 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
20b20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
20b30 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
20b40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
20b50 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
20b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20b70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
20b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20b90 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
20ba0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
20bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
20bc0 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20  printf(nBuf-30, 
20bd0 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72  zBuf, "%s", zDir
20be0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  );.          win
20bf0 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
20c00 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 29 3b 0a  nBuf-30, zBuf);.
20c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20c20 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
20c30 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
20c40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
20c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20c60 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
20c70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20c80 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
20c90 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
20ca0 5a 65 72 6f 28 20 6e 42 75 66 2b 31 20 29 3b 0a  Zero( nBuf+1 );.
20cb0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
20cc0 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
20cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20ce0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
20cf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
20d00 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
20d10 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20d20 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
20d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
20d40 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
20d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20d60 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
20d70 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
20d80 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43      osIsNT() ? C
20d90 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
20da0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
20db0 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20  _WIN_A, zDir,.  
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
20dd0 6f 6e 76 65 72 74 65 64 2c 20 6e 42 75 66 2b 31  onverted, nBuf+1
20de0 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
20df0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
20e00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
20e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20e20 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
20e30 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
20e40 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
20e50 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
20e60 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
20e70 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
20e80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20e90 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  ERR_CONVPATH, (D
20ea0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
20ed0 54 65 6d 70 6e 61 6d 65 31 22 2c 20 7a 44 69 72  Tempname1", zDir
20ee0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20ef0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
20f00 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
20f10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  .          /* At
20f20 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
20f30 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61  know the candida
20f40 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69  te directory exi
20f50 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20  sts and should. 
20f60 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75           ** be u
20f70 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  sed.  However, w
20f80 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f  e may need to co
20f90 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67  nvert the string
20fa0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
20fb0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d        ** its nam
20fc0 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e  e into UTF-8 (i.
20fd0 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d  e. if it is UTF-
20fe0 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20  16 right now).. 
20ff0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21000 20 20 20 20 20 20 69 66 28 20 6f 73 49 73 4e 54        if( osIsNT
21010 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  () ){.          
21020 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
21030 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
21040 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
21050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
21060 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
21070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21080 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
210a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
210b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
210c0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
210d0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
210e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
210f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
21100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21110 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
21120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
21140 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c  nprintf(nBuf-30,
21150 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74   zBuf, "%s", zUt
21160 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f8);.           
21170 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72   winMakeEndInDir
21180 53 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75  Sep(nBuf-30, zBu
21190 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
211a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
211b0 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f8);.           
211c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
211d0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
211e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
211f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21200 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21210 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
21220 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  -30, zBuf, "%s",
21230 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
21240 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 61 6b            winMak
21250 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 42 75  eEndInDirSep(nBu
21260 66 2d 33 30 2c 20 7a 42 75 66 29 3b 0a 20 20 20  f-30, zBuf);.   
21270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21280 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
212a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
212b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
212c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
212d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
212e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
212f0 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
21300 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
21310 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
21320 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54   else if( osIsNT
21330 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
21340 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53  zMulti;.    LPWS
21350 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73  TR zWidePath = s
21360 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
21370 28 20 6e 42 75 66 2a 73 69 7a 65 6f 66 28 57 43  ( nBuf*sizeof(WC
21380 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20  HAR) );.    if( 
21390 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20  !zWidePath ){.  
213a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
213b0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
213c0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
213d0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
213e0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
213f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21400 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21410 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
21420 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
21430 6e 42 75 66 2c 20 7a 57 69 64 65 50 61 74 68 29  nBuf, zWidePath)
21440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
21450 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
21460 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
21470 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21480 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21490 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
214a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
214b0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
214c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
214d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
214e0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
214f0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
21500 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
21520 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c  inGetTempname1",
21530 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
21540 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
21550 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
21560 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
21570 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
21580 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
21590 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73  uf-30, zBuf, "%s
215a0 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
215b0 20 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69    winMakeEndInDi
215c0 72 53 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a 42  rSep(nBuf-30, zB
215d0 75 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  uf);.      sqlit
215e0 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
215f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21600 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
21610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
21630 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
21640 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
21650 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
21660 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
21670 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
21680 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
21690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
216a0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
216b0 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
216c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
216d0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
216e0 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
216f0 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61     char *zMbcsPa
21700 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
21710 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a  ocZero( nBuf );.
21720 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61      if( !zMbcsPa
21730 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
21740 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21750 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21760 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
21770 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
21780 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
21790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
217a0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
217b0 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
217c0 6d 70 50 61 74 68 41 28 6e 42 75 66 2c 20 7a 4d  mpPathA(nBuf, zM
217d0 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
217e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
217f0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
21800 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21810 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21820 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
21830 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
21840 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
21850 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
21860 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
21870 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
218a0 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20  mpname2", 0);.  
218b0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20    }.    zUtf8 = 
218c0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
218d0 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
218e0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
218f0 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
21900 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21910 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25  Buf-30, zBuf, "%
21920 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
21930 20 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69    winMakeEndInDi
21940 72 53 65 70 28 6e 42 75 66 2d 33 30 2c 20 7a 42  rSep(nBuf-30, zB
21950 75 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  uf);.      sqlit
21960 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
21970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21980 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21990 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
219a0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
219b0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
219c0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
219d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
219e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
219f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
21a00 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
21a10 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e  _HAS_ANSI */.#en
21a20 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
21a30 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a  S_WINRT */..  /*
21a40 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
21a50 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
21a60 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
21a70 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
21a80 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
21a90 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
21aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21ab0 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20  OR..  */.  nLen 
21ac0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
21ad0 30 28 7a 42 75 66 29 3b 0a 0a 20 20 69 66 28 20  0(zBuf);..  if( 
21ae0 28 6e 4c 65 6e 20 2b 20 73 71 6c 69 74 65 33 53  (nLen + sqlite3S
21af0 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
21b00 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
21b10 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29   + 18) >= nBuf )
21b20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
21b30 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53  ee(zBuf);.    OS
21b40 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21b50 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21b60 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
21b70 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
21b80 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
21b90 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e   0, "winGetTempn
21ba0 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ame3", 0);.  }..
21bb0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21bc0 74 66 28 6e 42 75 66 2d 31 38 2d 6e 4c 65 6e 2c  tf(nBuf-18-nLen,
21bd0 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49   zBuf+nLen, SQLI
21be0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
21bf0 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c  FIX);..  j = sql
21c00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
21c10 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
21c20 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
21c30 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
21c40 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
21c50 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
21c60 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
21c70 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
21c80 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
21c90 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
21ca0 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
21cb0 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20  ;.  zBuf[j+1] = 
21cc0 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42  0;.  *pzBuf = zB
21cd0 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  uf;..  OSTRACE((
21ce0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e  "TEMP-FILENAME n
21cf0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
21d00 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  E_OK\n", zBuf));
21d10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21d20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
21d30 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
21d40 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72   named file is r
21d50 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
21d60 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  y.  Return false
21d70 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d   if.** it is som
21d80 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
21d90 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f  n a directory, o
21da0 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  r if there is an
21db0 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79  y kind of memory
21dc0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  .** allocation f
21dd0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
21de0 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
21df0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  onst void *zConv
21e00 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20  erted){.  DWORD 
21e10 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
21e20 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
21e30 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73  Errno;..  if( os
21e40 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
21e50 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
21e60 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
21e70 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
21e80 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
21e90 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
21ea0 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
21eb0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
21ec0 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
21ed0 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
21ee0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
21f10 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
21f20 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f40 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
21f50 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
21f60 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
21f70 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63   ){}.    if( !rc
21f80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21f90 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e   0; /* Invalid n
21fa0 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ame? */.    }.  
21fb0 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
21fc0 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
21fd0 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  tes;.#if SQLITE_
21fe0 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
21ff0 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  lse{.    attr = 
22000 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
22010 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
22020 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
22030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74    }.  return (at
22040 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
22050 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20  _ATTRIBUTES) && 
22060 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49  (attr&FILE_ATTRI
22070 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b  BUTE_DIRECTORY);
22080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
22090 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
220a0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20   int winOpen(.  
220b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
220c0 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  s,        /* Use
220d0 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d  d to get maximum
220e0 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74   path name lengt
220f0 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
22100 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
22110 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
22120 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
22130 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22140 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
22150 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
22160 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
22170 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
221a0 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
221b0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
221c0 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
221d0 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
221e0 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
221f0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
22200 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
22210 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
22220 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
22230 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
22240 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
22250 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
22260 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
22270 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
22280 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
22290 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
222a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
222b0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
222c0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
222d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
222e0 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
222f0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
22300 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
22310 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
22320 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
22330 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
22340 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
22350 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
22360 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
22370 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
22380 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
22390 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
223a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
223b0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
223c0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
223d0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
223e0 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20   char *zTmpname 
223f0 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70  = 0; /* For temp
22400 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20  orary filename, 
22410 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  if necessary. */
22420 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
22430 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
22440 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
22450 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
22460 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
22470 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
22480 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
22490 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
224a0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
224b0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
224c0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
224d0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
224e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
224f0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
22500 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
22510 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
22520 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22530 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
22540 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
22550 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
22560 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
22570 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
22580 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
22590 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
225a0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
225b0 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
225c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
225d0 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
225e0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
225f0 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
22600 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
22610 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
22620 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
22630 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
22640 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
22650 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
22660 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
22670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
22680 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
22690 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
226a0 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
226b0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
226c0 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
226d0 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
226e0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
226f0 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
22700 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
22710 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
22720 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
22730 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
22740 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
22750 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
22760 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
22770 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
22780 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
22790 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
227a0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
227b0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
227c0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
227d0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
227e0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
227f0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
22800 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
22810 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
22820 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
22830 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
22840 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
22850 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
22860 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
22870 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
22880 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
22890 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
228a0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
228b0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
228c0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
228d0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
228e0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
228f0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
22900 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
22910 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
22920 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
22930 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
22940 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
22950 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
22960 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
22970 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
22980 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
22990 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
229a0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
229b0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
229c0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
229d0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
229e0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
229f0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
22a00 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
22a10 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
22a20 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
22a30 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
22a40 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
22a50 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
22a60 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
22a70 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
22a80 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
22a90 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
22aa0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
22ab0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
22ac0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
22ad0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
22ae0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
22af0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
22b00 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
22b10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
22b20 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
22b30 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
22b40 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
22b50 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
22b60 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
22b70 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
22b80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
22b90 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
22ba0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
22bb0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
22bc0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
22bd0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
22be0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
22bf0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
22c00 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
22c10 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
22c20 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
22c30 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
22c40 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
22c50 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
22c60 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
22c70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
22c80 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
22c90 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65  e && !sqlite3_te
22ca0 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
22cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
22cc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
22cd0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
22ce0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
22cf0 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
22d00 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
22d10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
22d20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
22d30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
22d40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
22d50 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
22d60 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
22d70 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
22d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
22d90 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
22da0 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
22db0 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
22dc0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
22dd0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
22de0 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
22df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
22e10 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
22e20 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
22e30 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
22e40 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
22e50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22e60 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
22e70 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
22e80 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
22e90 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
22ea0 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
22eb0 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
22ec0 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
22ed0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
22ee0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
22ef0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
22f00 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
22f10 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
22f20 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
22f30 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
22f40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
22f50 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
22f60 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
22f70 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
22f80 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
22f90 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
22fa0 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
22fb0 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
22fc0 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
22fd0 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
22fe0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
22ff0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
23000 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
23010 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
23020 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
23030 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
23040 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
23050 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23060 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
23070 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
23080 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23090 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
230a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
230b0 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
230c0 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
230d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
230e0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
230f0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
23100 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
23110 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
23120 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
23130 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
23140 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23150 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
23160 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
23170 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
23180 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
23190 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
231a0 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
231b0 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
231c0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
231d0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
231e0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
231f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
23200 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
23210 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
23220 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
23230 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
23240 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
23250 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
23260 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
23270 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
23280 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
23290 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
232a0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
232b0 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
232c0 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
232d0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
232e0 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
232f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
23300 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
23310 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
23320 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
23330 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
23340 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
23350 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
23360 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
23370 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
23380 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
23390 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
233a0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
233b0 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
233c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
233d0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
233e0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
233f0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
23400 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
23410 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
23420 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
23430 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
23440 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
23450 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
23460 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
23470 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
23480 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
23490 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
234a0 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
234b0 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
234c0 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
234d0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
234e0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
234f0 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23510 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
23520 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
23550 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
23560 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
23570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
23580 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
23590 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
235a0 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
235b0 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
235c0 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
235d0 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
235e0 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
235f0 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
23600 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
23610 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
23620 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
23630 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
23640 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
23650 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
23660 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
23670 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
23680 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
23690 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
236a0 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
236b0 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
236c0 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
236d0 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
236e0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
236f0 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
23700 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
23710 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
23720 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
23730 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
23740 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
23750 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
23760 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
23770 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
23780 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
23790 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
237a0 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
237b0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
237c0 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
237d0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
237e0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
237f0 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
23800 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
23810 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
23820 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
23830 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
23840 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
23850 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
23860 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
23870 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
23880 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
23890 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
238a0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
238d0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
23900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
23930 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
23960 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
23970 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
23980 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239a0 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
239b0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
239c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
239d0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
239e0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
239f0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
23a00 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
23a10 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
23a40 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
23a70 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
23aa0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
23ab0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
23ae0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
23b10 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
23b20 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
23b50 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
23b60 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
23b70 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
23b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
23b90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
23ba0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
23bb0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
23bc0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
23bd0 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
23be0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
23c10 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
23c40 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
23c70 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
23ca0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
23cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
23cd0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
23ce0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
23d10 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
23d20 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d40 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
23d50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e    }.#endif.  win
23d60 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  LogIoerr(cnt);..
23d70 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
23d80 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
23d90 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
23da0 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
23db0 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
23dc0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
23dd0 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
23de0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
23df0 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
23e00 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
23e10 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
23e20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
23e30 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
23e40 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
23e50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
23e60 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
23e70 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
23e80 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
23e90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23ea0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
23eb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23ec0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
23ed0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
23ee0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
23ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
23f00 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
23f10 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
23f20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
23f30 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
23f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23f50 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
23f60 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
23f70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23f80 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
23f90 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
23fa0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
23fb0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
23fc0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
23fd0 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
23fe0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
23ff0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
24000 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
24010 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24020 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
24030 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
24040 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
24050 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
24060 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
24070 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
24080 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
24090 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
240a0 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
240b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
240c0 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
240d0 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
240e0 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
240f0 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
24100 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
24110 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
24120 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24130 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
24140 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
24150 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
24160 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
24170 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
24180 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
24190 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
241a0 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
241b0 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
241c0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
241d0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
241e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
241f0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24200 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24210 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
24220 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d   OSTRACE(("OPEN-
24230 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c  CE-LOCK name=%s,
24240 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65   rc=%s\n", zName
24250 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
24260 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75  (rc)));.    retu
24270 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
24280 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
24290 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
242a0 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
242b0 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
242c0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
242d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
242e0 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
242f0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
24300 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
24310 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
24320 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
24330 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
24340 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
24350 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
24360 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
24370 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
24380 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
24390 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
243a0 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
243b0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
243c0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
243d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
243e0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
243f0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
24400 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
24410 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
24420 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
24430 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
24440 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
24450 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
24460 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
24470 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
24480 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
24490 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
244a0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
244b0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
244c0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
244d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
244e0 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
244f0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
24500 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24510 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
24520 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
24530 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
24540 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
24550 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
24560 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
24570 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
24580 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
24590 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
245a0 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
245b0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
245c0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
245d0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
245e0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
245f0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
24600 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
24610 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
24620 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
24630 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
24640 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
24650 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
24660 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
24670 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
24680 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
24690 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
246a0 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
246b0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
246c0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
246d0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
246e0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
246f0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
24700 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
24710 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
24720 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
24730 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
24740 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
24750 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
24760 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
24770 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
24780 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
24790 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
247a0 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
247b0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
247e0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
247f0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
24800 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
24810 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
24820 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  rrno;.  void *zC
24830 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
24840 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
24850 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
24860 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b  AMETER(syncDir);
24870 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
24880 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
24890 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
248a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
248b0 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e  ETE name=%s, syn
248c0 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c  cDir=%d\n", zFil
248d0 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29  ename, syncDir))
248e0 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
248f0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
24900 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
24910 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
24920 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
24930 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 45      OSTRACE(("DE
24940 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LETE name=%s, rc
24950 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
24960 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  MEM\n", zFilenam
24970 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
24980 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24990 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  EM;.  }.  if( os
249a0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  IsNT() ){.    do
249b0 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
249c0 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
249d0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
249e0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
249f0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
24a00 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
24a10 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
24a20 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
24a30 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
24a40 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
24a50 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
24a60 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
24a90 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
24aa0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
24ab0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
24ac0 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
24ad0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
24ae0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
24af0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
24b00 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
24b10 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
24b20 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
24b30 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
24b40 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
24b50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24b60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
24b70 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
24b80 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
24b90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24ba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24bb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
24bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
24bd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  ak;.      }.#els
24be0 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  e.      attr = o
24bf0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
24c00 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esW(zConverted);
24c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
24c20 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
24c30 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
24c40 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
24c50 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
24c60 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
24c70 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
24c80 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
24c90 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
24ca0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
24cb0 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
24cc0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
24cd0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
24ce0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
24cf0 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
24d00 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
24d10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24d20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
24d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
24d50 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
24d60 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
24d70 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
24d80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24d90 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
24da0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
24db0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
24dc0 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
24dd0 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
24de0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
24df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
24e00 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
24e10 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
24e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24e30 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
24e40 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
24e50 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
24e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
24e70 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
24e80 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
24e90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
24ea0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
24eb0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
24ec0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
24ed0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f  I.  else{.    do
24ee0 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20   {.      attr = 
24ef0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
24f00 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
24f10 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  ;.      if ( att
24f20 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
24f30 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
24f40 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
24f50 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
24f60 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
24f70 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
24f80 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
24f90 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
24fa0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
24fb0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
24fc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
24fd0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
24fe0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
24ff0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
25000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25020 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
25030 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
25040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25050 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
25060 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
25070 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
25080 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
25090 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
250a0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
250b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
250c0 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
250d0 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eA(zConverted) )
250e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
250f0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
25100 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
25110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25120 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
25130 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
25140 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
25150 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25160 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
25170 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
25180 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
25190 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
251a0 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
251b0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26  endif.  if( rc &
251c0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
251d0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
251e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
251f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
25200 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73  OERR_DELETE, las
25210 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65  tErrno, "winDele
25220 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  te", zFilename);
25230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69  .  }else{.    wi
25240 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
25250 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
25260 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
25270 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
25280 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  TE name=%s, rc=%
25290 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  s\n", zFilename,
252a0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
252b0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
252c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
252d0 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  ck the existence
252e0 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
252f0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
25300 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
25310 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
25320 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
25330 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
25340 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
25350 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
25360 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
25370 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
25380 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
25390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
253a0 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
253b0 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
253c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
253d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
253e0 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
253f0 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
25400 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
25410 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
25420 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
25430 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
25440 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
25450 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
25460 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
25470 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
25480 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ; );.  OSTRACE((
25490 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
254a0 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f   flags=%x, pResO
254b0 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  ut=%p\n",.      
254c0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
254d0 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29  flags, pResOut))
254e0 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
254f0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
25500 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
25510 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
25520 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
25530 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43      OSTRACE(("AC
25540 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63  CESS name=%s, rc
25550 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
25560 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  MEM\n", zFilenam
25570 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
25580 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25590 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  EM;.  }.  if( os
255a0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
255b0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
255c0 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
255d0 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
255e0 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
255f0 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
25600 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
25610 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
25620 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
25630 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
25640 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
25670 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
25680 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rd, .           
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256a0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
256b0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
256c0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
256d0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
256e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
256f0 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
25700 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
25710 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
25720 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
25730 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
25740 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
25750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
25760 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
25770 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
25780 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
25790 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
257a0 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  h==0 .          
257b0 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
257c0 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a  leSizeLow==0 ){.
257d0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
257e0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
257f0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65  IBUTES;.      }e
25800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
25810 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
25820 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
25830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
25840 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49  e{.      winLogI
25850 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20  oerr(cnt);.     
25860 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d   if( lastErrno!=
25870 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
25880 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e  OUND && lastErrn
25890 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o!=ERROR_PATH_NO
258a0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
258b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
258c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
258d0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
258e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
258f0 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73  OERR_ACCESS, las
25900 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65  tErrno, "winAcce
25910 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ss",.           
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
25940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25950 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
25960 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
25970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25980 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
25990 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
259a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72    else{.    attr
259b0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
259c0 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
259d0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
259e0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
259f0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25a00 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
25a10 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
25a20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
25a30 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  D:.    case SQLI
25a40 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
25a50 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
25a60 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
25a70 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
25a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
25a90 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
25aa0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
25ab0 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
25ac0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
25ad0 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20  TES &&.         
25ae0 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45      (attr & FILE
25af0 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f  _ATTRIBUTE_READO
25b00 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62  NLY)==0;.      b
25b10 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
25b20 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
25b30 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
25b40 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
25b50 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
25b60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43  .  OSTRACE(("ACC
25b70 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65  ESS name=%s, pRe
25b80 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
25b90 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
25ba0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
25bb0 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65    zFilename, pRe
25bc0 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
25bd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25be0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
25bf0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
25c00 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
25c10 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
25c20 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
25c30 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65  etter.** followe
25c40 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61  d by a colon cha
25c50 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
25c60 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
25c70 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
25c80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25c90 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65  Pathname.){.  re
25ca0 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49 73  turn ( sqlite3Is
25cb0 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b  alpha(zPathname[
25cc0 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65  0]) && zPathname
25cd0 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f  [1]==':' );.}../
25ce0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
25cf0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
25d00 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
25d10 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
25d20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a  verbatim.  If.**
25d30 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
25d40 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20  urned from this 
25d50 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61  function, the ca
25d60 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
25d70 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73  ust simply.** us
25d80 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70  e the provided p
25d90 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69  ath name verbati
25da0 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69  m -OR- resolve i
25db0 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  t into a full pa
25dc0 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67  th name.** using
25dd0 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68   the GetFullPath
25de0 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66  Name Win32 API f
25df0 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69  unction (if avai
25e00 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  lable)..*/.stati
25e10 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62  c BOOL winIsVerb
25e20 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20  atimPathname(.  
25e30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
25e40 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20  hname.){.  /*.  
25e50 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
25e60 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
25e70 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20  a forward slash 
25e80 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20  or a backslash, 
25e90 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a  it is either.  *
25ea0 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61  * a legal UNC na
25eb0 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c  me, a volume rel
25ec0 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61  ative path, or a
25ed0 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20  n absolute path 
25ee0 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  name in the.  **
25ef0 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f   "Unix" format o
25f00 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72  n Windows.  Ther
25f10 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79  e is no easy way
25f20 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
25f30 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  e between.  ** t
25f40 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73  he final two cas
25f50 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77  es; therefore, w
25f60 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66  e return the saf
25f70 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
25f80 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20  of TRUE.  ** so 
25f90 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20  that callers of 
25fa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
25fb0 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74  ll simply use it
25fc0 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a   verbatim..  */.
25fd0 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72 53    if ( winIsDirS
25fe0 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ep(zPathname[0])
25ff0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26000 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
26010 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
26020 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
26030 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20   a letter and a 
26040 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68  colon it is eith
26050 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a  er a volume.  **
26060 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f   relative path o
26070 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
26080 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20  th.  Callers of 
26090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
260a0 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65  st not.  ** atte
260b0 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20  mpt to treat it 
260c0 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  as a relative pa
260d0 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68  th name (i.e. th
260e0 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79  ey should simply
260f0 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72   use.  ** it ver
26100 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69  batim)..  */.  i
26110 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  f ( winIsDriveLe
26120 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61  tterAndColon(zPa
26130 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72  thname) ){.    r
26140 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
26150 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  /*.  ** If we
26160 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
26170 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d  nt, the path nam
26180 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20  e should almost 
26190 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70  certainly be a p
261a0 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74  urely.  ** relat
261b0 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ive one (i.e. no
261c0 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f  t a UNC name, no
261d0 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20  t absolute, and 
261e0 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  not volume relat
261f0 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  ive)..  */.  ret
26200 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a  urn FALSE;.}../*
26210 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
26220 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
26230 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
26240 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
26250 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
26260 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
26270 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
26280 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
26290 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
262a0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
262b0 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
262c0 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
262d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
262e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
262f0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
26300 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
26310 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
26320 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
26330 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
26340 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
26350 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
26360 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
26370 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
26380 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
26390 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
263a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
263b0 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
263c0 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  {.  .#if defined
263d0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
263e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
263f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
26400 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
26410 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
26420 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c  ;.  assert( nFul
26430 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l>=pVfs->mxPathn
26440 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ame );.  if ( sq
26450 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
26460 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
26470 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
26480 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
26490 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
264a0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
264b0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
264c0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
264d0 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
264e0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
264f0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
26500 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
26510 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
26520 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
26530 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
26540 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
26550 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
26560 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
26570 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
26580 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
26590 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20  and a slash..   
265a0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   */.    char *zO
265b0 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ut = sqlite3Mall
265c0 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78  ocZero( pVfs->mx
265d0 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20  Pathname+1 );.  
265e0 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20    if( !zOut ){. 
265f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26600 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
26610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
26620 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43  gwin_conv_path(C
26630 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
26640 41 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20  A|CCP_RELATIVE, 
26650 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
26660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26670 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2d 3e            pVfs->
26680 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
26690 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
266a0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
266b0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
266c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
266d0 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
266e0 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26700 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
26710 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61  athname1", zRela
26720 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
26730 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
26740 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
26750 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
26760 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
26770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
26790 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
267a0 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 4f  nGetDirSep(), zO
267b0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
267c0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
267d0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 63 79  else{.    if( cy
267e0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43  gwin_conv_path(C
267f0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
26800 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  A, zRelative, zF
26810 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c 30 20 29 7b  ull, nFull)<0 ){
26820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
26830 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
26840 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
26850 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
26860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26870 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
26880 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
26890 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
268a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
268b0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
268c0 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
268d0 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
268e0 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
268f0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
26900 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
26910 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
26920 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
26930 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
26940 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
26950 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
26960 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
26970 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
26980 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
26990 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
269a0 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
269b0 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
269c0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
269d0 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
269e0 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
269f0 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
26a00 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
26a10 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
26a20 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
26a30 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
26a40 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
26a50 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
26a60 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
26a70 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
26a80 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
26a90 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
26aa0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
26ab0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
26ac0 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
26ad0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
26ae0 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
26af0 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
26b00 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
26b10 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
26b20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
26b30 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
26b40 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
26b50 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
26b80 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
26b90 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
26ba0 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
26bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
26bc0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
26bd0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
26be0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
26bf0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
26c00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26c10 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
26c20 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
26c30 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
26c40 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
26c50 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
26c60 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
26c70 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
26c80 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a  .  char *zOut;..
26c90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
26ca0 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
26cb0 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
26cc0 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
26cd0 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
26ce0 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
26cf0 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
26d00 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
26d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
26d20 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
26d30 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
26d40 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74  rAndColon(zRelat
26d50 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52  ive+1) ){.    zR
26d60 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
26d70 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
26d80 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
26d90 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
26da0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
26db0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
26dc0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
26dd0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
26de0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
26df0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
26e00 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
26e10 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
26e20 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
26e30 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
26e40 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
26e50 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
26e60 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
26e70 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
26e80 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
26e90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
26ea0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
26eb0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
26ec0 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
26ed0 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
26ee0 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
26ef0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
26f00 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
26f10 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
26f20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
26f30 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
26f40 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
26f50 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
26f60 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
26f70 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
26f80 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
26f90 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
26fa0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
26fb0 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
26fc0 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
26fd0 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
26fe0 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
26ff0 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
27000 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
27010 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
27020 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
27030 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
27040 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %c%s",.         
27050 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27060 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
27070 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
27080 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  (), zRelative);.
27090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
270a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  E_OK;.  }.  zCon
270b0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
270c0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
270d0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
270e0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
270f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
27100 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
27110 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
27120 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
27130 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
27140 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
27150 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
27160 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
27170 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
27180 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
27190 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
271a0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
271b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
271c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
271d0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
271e0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
271f0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
27210 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
27220 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27230 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
27240 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
27250 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
27260 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
27270 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
27280 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
27290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
272a0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
272b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
272c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
272d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
272e0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
272f0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
27300 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
27310 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
27320 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
27330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
27340 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
27350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27360 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
27370 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
27380 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
27390 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
273a0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
273b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
273c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
273d0 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
273e0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
273f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27400 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27410 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
27420 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
27430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27440 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
27450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
27460 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
27470 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
27480 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
27490 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
274a0 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
274b0 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
274c0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
274d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
274e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
274f0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
27500 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
27510 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
27520 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
27530 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
27560 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76  name3", zRelativ
27570 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
27580 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
27590 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
275a0 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
275b0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
275c0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
275d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
275e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
275f0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
27600 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27610 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
27620 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
27630 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
27640 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
27650 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
27660 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
27670 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27680 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27690 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
276a0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
276b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
276c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
276d0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
276e0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
276f0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27710 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34  winFullPathname4
27720 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
27730 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27740 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
27750 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
27760 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
27770 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
27780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27790 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
277a0 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
277b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
277c0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
277d0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
277e0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
277f0 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
27800 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
27810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27820 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
27830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27840 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
27850 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
27860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27870 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
27880 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
27890 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
278a0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
278b0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
278c0 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
278d0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
278e0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
278f0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
27900 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
27910 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
27920 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
27930 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
27940 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
27950 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
27960 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
27970 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
27980 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
27990 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
279a0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
279b0 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
279c0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
279d0 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
279e0 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69  *zConverted = wi
279f0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
27a00 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
27a10 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
27a20 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
27a30 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
27a40 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
27a50 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
27a60 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
27a70 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
27a80 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
27a90 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
27aa0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
27ab0 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
27ac0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
27ad0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
27ae0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
27af0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
27b00 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
27b10 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
27b20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
27b30 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
27b40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
27b50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
27b60 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
27b70 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
27b80 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
27b90 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
27ba0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
27bb0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
27bc0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
27bd0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
27be0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
27bf0 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
27c00 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
27c10 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
27c20 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
27c30 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
27c40 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
27c50 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
27c60 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
27c70 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
27c80 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
27c90 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41 64 64  id))osGetProcAdd
27ca0 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48  ressA((HANDLE)pH
27cb0 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
27cc0 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
27cd0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
27ce0 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
27cf0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
27d00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
27d10 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
27d20 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
27d30 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
27d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
27d50 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
27d60 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
27d70 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
27d80 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
27d90 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
27da0 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
27db0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
27dc0 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
27dd0 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
27de0 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
27df0 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
27e00 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
27e10 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
27e20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27e30 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
27e40 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
27e50 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
27e60 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
27e70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
27e80 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
27e90 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
27ea0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
27eb0 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
27ec0 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
27ed0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
27ee0 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
27ef0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
27f00 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
27f10 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
27f20 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
27f30 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
27f40 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
27f50 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
27f60 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
27f70 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
27f80 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
27f90 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
27fa0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
27fb0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
27fc0 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20  f(pid);.  }.#if 
27fd0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
27fe0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f    if( sizeof(ULO
27ff0 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20  NGLONG)<=nBuf-n 
28000 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47  ){.    ULONGLONG
28010 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
28020 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d  Count64();.    m
28030 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
28040 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
28050 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
28060 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
28070 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
28080 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
28090 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
280a0 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
280b0 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
280c0 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
280d0 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
280e0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
280f0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
28100 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
28110 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
28120 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
28130 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f  INTEGER i;.    o
28140 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
28150 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20  eCounter(&i);.  
28160 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
28170 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29  ], &i, sizeof(i)
28180 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
28190 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  of(i);.  }.#endi
281a0 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  f.  return n;.}.
281b0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
281c0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
281d0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
281e0 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
281f0 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
28200 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
28210 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
28220 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
28230 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
28240 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
28250 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
28260 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
28270 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
28280 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
28290 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
282a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
282b0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
282c0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
282d0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
282e0 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
282f0 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
28300 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
28310 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
28320 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
28330 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
28340 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
28350 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
28360 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
28370 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
28380 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
28390 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
283a0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
283b0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
283c0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
283d0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
283e0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
283f0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
28400 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
28410 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
28420 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
28430 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
28440 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
28450 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
28460 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
28470 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
28480 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
28490 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
284a0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
284b0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
284c0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
284d0 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
284e0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
284f0 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
28500 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
28510 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
28520 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
28530 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
28540 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
28550 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
28560 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
28570 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
28580 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
28590 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
285a0 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65  fs *pVfs, sqlite
285b0 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
285c0 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73  .  /* FILETIME s
285d0 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34  tructure is a 64
285e0 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65  -bit value repre
285f0 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62  senting the numb
28600 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d  er of .     100-
28610 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
28620 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
28630 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
28640 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20   2305813.5). .  
28650 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
28660 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
28670 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
28680 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
28690 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
286a0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
286b0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
286c0 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
286d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
286e0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
286f0 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
28700 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
28710 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
28720 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
28730 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
28740 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
28750 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
28760 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
28770 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20  itValue = .     
28780 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
28790 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
287a0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
287b0 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28  000000 +.      (
287c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39  sqlite3_int64)29
287d0 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51  4967296;..#if SQ
287e0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
287f0 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b  SYSTEMTIME time;
28800 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
28810 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20  me(&time);.  /* 
28820 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  if SystemTimeToF
28830 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c  ileTime() fails,
28840 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
28850 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79  . */.  if (!osSy
28860 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
28870 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a  me(&time,&ft)){.
28880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28890 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c  E_ERROR;.  }.#el
288a0 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
288b0 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
288c0 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  &ft );.#endif.. 
288d0 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c   *piNow = winFil
288e0 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20  etimeEpoch +.   
288f0 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c           ((((sql
28900 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
28910 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61  HighDateTime)*ma
28920 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a  x32BitValue) + .
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28940 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
28950 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
28960 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31  (sqlite3_int64)1
28970 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51  0000;..#ifdef SQ
28980 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
28990 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
289a0 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
289b0 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
289c0 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
289d0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
289e0 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
289f0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
28a00 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
28a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28a20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  OK;.}../*.** Fin
28a30 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
28a40 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
28a50 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
28a60 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
28a70 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
28a80 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
28a90 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
28aa0 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
28ab0 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
28ac0 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
28ad0 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
28ae0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
28af0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
28b00 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
28b10 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
28b20 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e  le *prNow){.  in
28b30 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
28b40 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20  int64 i;.  rc = 
28b50 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
28b60 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20  t64(pVfs, &i);. 
28b70 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
28b80 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
28b90 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74  000.0;.  }.  ret
28ba0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28bb0 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
28bc0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
28bd0 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d  works like a com
28be0 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47  bination of.** G
28bf0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e  etLastError() an
28c00 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28  d FormatMessage(
28c10 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72  ) on Windows (or
28c20 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74   errno and.** st
28c30 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e  rerror_r() on Un
28c40 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72  ix). After an er
28c50 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
28c60 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63  by an OS.** func
28c70 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c  tion, SQLite cal
28c80 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
28c90 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74   with zBuf point
28ca0 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66  ing to.** a buff
28cb0 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73  er of nBuf bytes
28cc0 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73  . The OS layer s
28cd0 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74  hould populate t
28ce0 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74  he.** buffer wit
28cf0 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  h a nul-terminat
28d00 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  ed UTF-8 encoded
28d10 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
28d20 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  * describing the
28d30 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74   last IO error t
28d40 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  o have occurred 
28d50 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69  within the calli
28d60 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a  ng.** thread..**
28d70 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72  .** If the error
28d80 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   message is too 
28d90 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75  large for the su
28da0 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a  pplied buffer,.*
28db0 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74  * it should be t
28dc0 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65  runcated. The re
28dd0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47  turn value of xG
28de0 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69  etLastError.** i
28df0 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
28e00 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
28e10 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
28e20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
28e30 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
28e40 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
28e50 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d  ncated). If non-
28e60 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
28e70 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
28e80 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
28e90 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
28ea0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72  -terminator char
28eb0 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20  acter.** in the 
28ec0 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a  output buffer..*
28ed0 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69  *.** Not supplyi
28ee0 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
28ef0 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f  age will have no
28f00 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a   adverse effect.
28f10 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74  ** on SQLite. It
28f20 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65   is fine to have
28f30 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
28f40 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a  on that never.**
28f50 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
28f60 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  r message:.**.**
28f70 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45     int xGetLastE
28f80 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
28f90 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
28fa0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a  , char *zBuf){.*
28fb0 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75  *     assert(zBu
28fc0 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20  f[0]=='\0');.** 
28fd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a      return 0;.**
28fe0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76     }.**.** Howev
28ff0 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d  er if an error m
29000 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69  essage is suppli
29010 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69  ed, it will be i
29020 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62  ncorporated.** b
29030 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68  y sqlite into th
29040 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
29050 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
29060 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73   user using.** s
29070 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c  qlite3_errmsg(),
29080 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67   possibly making
29090 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65   IO errors easie
290a0 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73  r to debug..*/.s
290b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
290c0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
290d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
290e0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
290f0 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
29100 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29110 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73  return winGetLas
29120 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
29130 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
29140 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zBuf);.}../*.*
29150 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
29160 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
29170 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
29180 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
29190 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
291a0 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
291b0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
291c0 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
291d0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
291e0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
291f0 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
29200 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
29210 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
29220 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
29230 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
29240 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
29250 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
29260 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
29270 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
29280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
29290 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
292c0 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
292d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
292e0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
292f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
29300 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
29310 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
29320 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
29330 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
29340 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
29350 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
29360 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
29370 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
29380 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
29390 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
293a0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
293b0 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
293c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
293d0 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
293e0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
293f0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
29400 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
29410 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
29420 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
29430 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
29440 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
29450 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
29460 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
29470 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
29480 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
29490 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
294a0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
294b0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
294c0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
294d0 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
294e0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
294f0 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
29500 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
29510 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
29520 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
29530 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
29540 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20  ystemCall,   /* 
29550 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
29560 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69  */.  };.#if defi
29570 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
29580 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61  _HAS_WIDE).  sta
29590 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
295a0 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d  winLongPathVfs =
295b0 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
295c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
295d0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
295e0 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
295f0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
29600 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
29610 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
29620 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
29630 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29650 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
29660 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20  in32-longpath", 
29670 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
29680 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
29690 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
296a0 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
296b0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
296c0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
296d0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
296e0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
296f0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
29700 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
29710 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
29720 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
29730 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
29740 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
29750 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
29760 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
29770 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
29780 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
29790 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
297a0 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
297b0 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
297c0 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
297d0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
297e0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
297f0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
29800 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
29810 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
29820 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
29830 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
29840 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
29850 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
29860 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
29870 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
29880 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
29890 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
298a0 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
298b0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
298c0 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
298d0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
298e0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
298f0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
29900 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
29910 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
29920 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
29930 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
29940 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
29950 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62  endif..  /* Doub
29960 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
29970 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
29980 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
29990 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
299a0 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
299b0 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
299c0 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
299d0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
299e0 53 79 73 63 61 6c 6c 29 3d 3d 37 36 20 29 3b 0a  Syscall)==76 );.
299f0 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
29a00 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
29a10 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
29a20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
29a30 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
29a40 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
29a50 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
29a60 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
29a70 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
29a80 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
29a90 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
29aa0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
29ab0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
29ac0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
29ad0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
29ae0 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
29af0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
29b00 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
29b10 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
29b20 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
29b30 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
29b40 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
29b50 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
29b60 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
29b70 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b  LongPathVfs, 0);
29b80 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
29b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
29ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
29bb0 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66 20  end(void){ .#if 
29bc0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
29bd0 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
29be0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
29bf0 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
29c00 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
29c10 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
29c20 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
29c30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
29c40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
29c50 57 49 4e 20 2a 2f 0a                             WIN */.