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

Artifact af9db76467add89679d3ebb451069c2f842ecd3c:


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 52  .#endif../*.** R
0bc0: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
0bd0: 67 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  g that should be
0be0: 20 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72   used as the dir
0bf0: 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
0c00: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e  ..*/.#ifndef win
0c10: 47 65 74 44 69 72 44 65 70 0a 23 20 20 69 66 64  GetDirDep.#  ifd
0c20: 65 66 20 5f 5f 43 59 47 57 49 4e 5f 5f 0a 23 20  ef __CYGWIN__.# 
0c30: 20 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74     define winGet
0c40: 44 69 72 44 65 70 28 29 20 20 20 20 20 20 20 20  DirDep()        
0c50: 20 20 20 20 20 20 22 2f 22 0a 23 20 20 65 6c 73        "/".#  els
0c60: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 77 69  e.#    define wi
0c70: 6e 47 65 74 44 69 72 44 65 70 28 29 20 20 20 20  nGetDirDep()    
0c80: 20 20 20 20 20 20 20 20 20 20 22 5c 5c 22 0a 23            "\\".#
0c90: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0ca0: 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64  /*.** Do we need
0cb0: 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66   to manually def
0cc0: 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 69  ine the Win32 fi
0cd0: 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20  le mapping APIs 
0ce0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 4c  for use with WAL
0cf0: 0a 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74  .** mode (e.g. t
0d00: 68 65 73 65 20 41 50 49 73 20 61 72 65 20 61 76  hese APIs are av
0d10: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 57  ailable in the W
0d20: 69 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b 20 68  indows CE SDK; h
0d30: 6f 77 65 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20  owever, they.** 
0d40: 61 72 65 20 6e 6f 74 20 70 72 65 73 65 6e 74 20  are not present 
0d50: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 69  in the header fi
0d60: 6c 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  le)?.*/.#if SQLI
0d70: 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50  TE_WIN32_FILEMAP
0d80: 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65 66  PING_API && !def
0d90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0da0: 5f 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  _WAL)./*.** Two 
0db0: 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70  of the file mapp
0dc0: 69 6e 67 20 41 50 49 73 20 61 72 65 20 64 69 66  ing APIs are dif
0dd0: 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e  ferent under Win
0de0: 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  RT.  Figure out 
0df0: 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20  which.** set we 
0e00: 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  need..*/.#if SQL
0e10: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e  ITE_OS_WINRT.WIN
0e20: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
0e30: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
0e40: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48  MappingFromApp(H
0e50: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
0e60: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
0e70: 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55  IBUTES, ULONG, U
0e80: 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29  LONG64, LPCWSTR)
0e90: 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50  ;..WINBASEAPI LP
0ea0: 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56  VOID WINAPI MapV
0eb0: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
0ec0: 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20  (HANDLE, ULONG, 
0ed0: 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29  ULONG64, SIZE_T)
0ee0: 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69  ;.#else.#if defi
0ef0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0f00: 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41  _HAS_ANSI).WINBA
0f10: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0f20: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
0f30: 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c  ppingA(HANDLE, L
0f40: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
0f50: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
0f60: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
0f70: 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65  ORD, LPCSTR);.#e
0f80: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
0f90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
0fa0: 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64  _ANSI) */..#if d
0fb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
0fc0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49  N32_HAS_WIDE).WI
0fd0: 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20  NBASEAPI HANDLE 
0fe0: 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c  WINAPI CreateFil
0ff0: 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45  eMappingW(HANDLE
1000: 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  , LPSECURITY_ATT
1010: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
1020: 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c     DWORD, DWORD,
1030: 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29   DWORD, LPCWSTR)
1040: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ;.#endif /* defi
1050: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1060: 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57  _HAS_WIDE) */..W
1070: 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44  INBASEAPI LPVOID
1080: 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f   WINAPI MapViewO
1090: 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57  fFile(HANDLE, DW
10a0: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
10b0: 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64  D, SIZE_T);.#end
10c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
10d0: 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WINRT */../*.** 
10e0: 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69 6e  This file mappin
10f0: 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20  g API is common 
1100: 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61 6e  to both Win32 an
1110: 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42  d WinRT..*/.WINB
1120: 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41  ASEAPI BOOL WINA
1130: 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  PI UnmapViewOfFi
1140: 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e  le(LPCVOID);.#en
1150: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
1160: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
1170: 41 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28  API && !defined(
1180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
1190: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20   */../*.** Some 
11a0: 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  Microsoft compil
11b0: 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
11c0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
11d0: 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c  ndef INVALID_FIL
11e0: 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64  E_ATTRIBUTES.# d
11f0: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49  efine INVALID_FI
1200: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28  LE_ATTRIBUTES ((
1210: 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69  DWORD)-1) .#endi
1220: 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f  f..#ifndef FILE_
1230: 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69  FLAG_MASK.# defi
1240: 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53  ne FILE_FLAG_MAS
1250: 4b 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46  K          (0xFF
1260: 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a  3C0000).#endif..
1270: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54  #ifndef FILE_ATT
1280: 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65  RIBUTE_MASK.# de
1290: 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42  fine FILE_ATTRIB
12a0: 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78  UTE_MASK     (0x
12b0: 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66  0003FFF7).#endif
12c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12d0: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72  _OMIT_WAL./* For
12e0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
12f0: 74 6f 20 73 74 72 75 63 74 75 72 65 73 20 75 73  to structures us
1300: 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79  ed for WAL */.ty
1310: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1320: 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20  Shm winShm;     
1330: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65        /* A conne
1340: 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1350: 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65  memory */.typede
1360: 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  f struct winShmN
1370: 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20  ode winShmNode; 
1380: 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66    /* A region of
1390: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
13a0: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
13b0: 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69  WinCE lacks nati
13c0: 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66  ve support for f
13d0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77  ile locking so w
13e0: 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69  e have to fake i
13f0: 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63  t.** with some c
1400: 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a  ode of our own..
1410: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
1420: 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73  _WINCE.typedef s
1430: 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20  truct winceLock 
1440: 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73  {.  int nReaders
1450: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
1460: 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b  r of reader lock
1470: 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  s obtained */.  
1480: 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20  BOOL bPending;  
1490: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
14a0: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
14b0: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
14c0: 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73  d */.  BOOL bRes
14d0: 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e  erved;     /* In
14e0: 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76  dicates a reserv
14f0: 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ed lock has been
1500: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
1510: 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20  OOL bExclusive; 
1520: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
1530: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1540: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
1550: 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f  ned */.} winceLo
1560: 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ck;.#endif../*.*
1570: 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74  * The winFile st
1580: 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62  ructure is a sub
1590: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
15a0: 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20  _file* specific 
15b0: 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20  to the win32.** 
15c0: 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65  portability laye
15d0: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
15e0: 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e  ruct winFile win
15f0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e  File;.struct win
1600: 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73  File {.  const s
1610: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1620: 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a  s *pMethod; /***
1630: 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
1640: 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  **/.  sqlite3_vf
1650: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a  s *pVfs;      /*
1660: 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74 6f   The VFS used to
1670: 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20   open this file 
1680: 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a0: 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73  Handle for acces
16b0: 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f  sing the file */
16c0: 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20  .  u8 locktype; 
16d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
16e0: 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65  pe of lock curre
16f0: 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69  ntly held on thi
1700: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72  s file */.  shor
1710: 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
1720: 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20  ;   /* Randomly 
1730: 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64  chosen byte used
1740: 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63   as a shared loc
1750: 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c  k */.  u8 ctrlFl
1760: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ags;           /
1770: 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49  * Flags.  See WI
1780: 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f  NFILE_* below */
1790: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
17a0: 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  no;        /* Th
17b0: 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
17c0: 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
17d0: 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64  O error */.#ifnd
17e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
17f0: 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68  AL.  winShm *pSh
1800: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1810: 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72  Instance of shar
1820: 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69  ed memory on thi
1830: 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  s file */.#endif
1840: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1850: 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75  Path;      /* Fu
1860: 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1870: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
1880: 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20  t szChunk;      
1890: 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73        /* Chunk s
18a0: 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  ize configured b
18b0: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
18c0: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
18d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53  _OS_WINCE.  LPWS
18e0: 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  TR zDeleteOnClos
18f0: 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66  e;  /* Name of f
1900: 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68  ile to delete wh
1910: 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20  en closing */.  
1920: 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20  HANDLE hMutex;  
1930: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78          /* Mutex
1940: 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
1950: 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65   access to share
1960: 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41  d lock */  .  HA
1970: 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20  NDLE hShared;   
1980: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1990: 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75  memory segment u
19a0: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
19b0: 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c  */.  winceLock l
19c0: 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  ocal;        /* 
19d0: 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62  Locks obtained b
19e0: 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20  y this instance 
19f0: 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20  of winFile */.  
1a00: 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65  winceLock *share
1a10: 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61  d;      /* Globa
1a20: 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65  l shared lock me
1a30: 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  mory for the fil
1a40: 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  e  */.#endif.#if
1a50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1a60: 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46  _SIZE>0.  int nF
1a70: 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20  etchOut;        
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a90: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
1aa0: 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
1ab0: 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68  es */.  HANDLE h
1ac0: 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
1ad0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1ae0: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65  for accessing me
1af0: 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  mory mapping */.
1b00: 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69    void *pMapRegi
1b10: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1b20: 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d  /* Area memory m
1b30: 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  apped */.  sqlit
1b40: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1b50: 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62  e;       /* Usab
1b60: 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65  le size of mappe
1b70: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  d region */.  sq
1b80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1b90: 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41  SizeActual; /* A
1ba0: 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61  ctual size of ma
1bb0: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  pped region */. 
1bc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1bd0: 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f  mapSizeMax;    /
1be0: 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e  * Configured FCN
1bf0: 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c  TL_MMAP_SIZE val
1c00: 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
1c10: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
1c20: 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c  alues for winFil
1c30: 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23  e.ctrlFlags.*/.#
1c40: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52  define WINFILE_R
1c50: 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30  DONLY          0
1c60: 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  x02   /* Connect
1c70: 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79  ion is read only
1c80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
1c90: 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20  ILE_PERSIST_WAL 
1ca0: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65      0x04   /* Pe
1cb0: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
1cc0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
1cd0: 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20  FILE_PSOW       
1ce0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53       0x10   /* S
1cf0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1d00: 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1d10: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69  */../*. * The si
1d20: 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1d30: 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
1d40: 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62  _win32_write_deb
1d50: 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  ug().. */.#ifnde
1d60: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
1d70: 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64  BG_BUF_SIZE.#  d
1d80: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
1d90: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
1da0: 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69    ((int)(4096-si
1db0: 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65  zeof(DWORD))).#e
1dc0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
1dd0: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
1de0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1df0: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
1e00: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
1e10: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
1e20: 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68  ory should be ch
1e30: 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64  anged.. */.#ifnd
1e40: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1e50: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
1e60: 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  YPE.#  define SQ
1e70: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
1e80: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28  DIRECTORY_TYPE (
1e90: 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  1).#endif../*. *
1ea0: 20 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   The value used 
1eb0: 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e  with sqlite3_win
1ec0: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
1ed0: 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68  () to specify th
1ee0: 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72  at. * the tempor
1ef0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68  ary directory sh
1f00: 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e  ould be changed.
1f10: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
1f20: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
1f30: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20  IRECTORY_TYPE.# 
1f40: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1f50: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
1f60: 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e  ORY_TYPE (2).#en
1f70: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f  dif../*. * If co
1f80: 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
1f90: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
1fa0: 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77  on Windows, we w
1fb0: 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76  ill use the. * v
1fc0: 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49  arious Win32 API
1fd0: 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20   heap functions 
1fe0: 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f  instead of our o
1ff0: 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53  wn.. */.#ifdef S
2000: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
2010: 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69  OC../*. * If thi
2020: 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  s is non-zero, a
2030: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
2040: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2050: 62 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69  by the native Wi
2060: 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72  n32. * allocator
2070: 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65   subsystem; othe
2080: 72 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75  rwise, the defau
2090: 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20  lt process heap 
20a0: 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54  will be used.  T
20b0: 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68  his. * setting h
20c0: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65  as no effect whe
20d0: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20  n compiling for 
20e0: 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75  WinRT.  By defau
20f0: 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62  lt, this is enab
2100: 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73  led. * and an is
2110: 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c  olated heap will
2120: 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73   be created to s
2130: 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74  tore all allocat
2140: 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a  ed data.. *. ***
2150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57  ***********. * W
21a0: 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d  ARNING: It is im
21b0: 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20  portant to note 
21c0: 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73  that when this s
21d0: 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65  etting is non-ze
21e0: 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20  ro and the. *   
21f0: 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75         winMemShu
2200: 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69  tdown function i
2210: 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62  s called (e.g. b
2220: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68  y the sqlite3_sh
2230: 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20  utdown. *       
2240: 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c     function), al
2250: 6c 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  l data that was 
2260: 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
2270: 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61  the isolated hea
2280: 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  p will. *       
2290: 20 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65     be freed imme
22a0: 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20  diately and any 
22b0: 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73  attempt to acces
22c0: 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72  s any of that fr
22d0: 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20  eed. *          
22e0: 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74  data will almost
22f0: 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c   certainly resul
2300: 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74  t in an immediat
2310: 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69  e access violati
2320: 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.. ***********
2330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ***. */.#ifndef 
2380: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2390: 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69  P_CREATE.#  defi
23a0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
23b0: 48 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28  HEAP_CREATE    (
23c0: 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TRUE).#endif../*
23d0: 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20  . * The initial 
23e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
23f0: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
2400: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
2410: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
2420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2430: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
2440: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2450: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
2460: 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45  IT_SIZE ((SQLITE
2470: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
2480: 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20  IZE) * \.       
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
24c0: 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39  PAGE_SIZE) + 419
24d0: 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  4304).#endif../*
24e0: 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  . * The maximum 
24f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33  size of the Win3
2500: 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e  2-specific heap.
2510: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
2520: 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69   be zero.. */.#i
2530: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2540: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
2550: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2560: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
2570: 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69  _SIZE  (0).#endi
2580: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74  f../*. * The ext
2590: 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20  ra flags to use 
25a0: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  in calls to the 
25b0: 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e  Win32 heap APIs.
25c0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
25d0: 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20   be. * zero for 
25e0: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
25f0: 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  vior.. */.#ifnde
2600: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
2610: 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66  EAP_FLAGS.#  def
2620: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2630: 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20  _HEAP_FLAGS     
2640: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (0).#endif.../*.
2650: 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74  ** The winMemDat
2660: 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72  a structure stor
2670: 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  es information r
2680: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57  equired by the W
2690: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a  in32-specific.**
26a0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
26b0: 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  hods implementat
26c0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
26d0: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
26e0: 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74  a winMemData;.st
26f0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2700: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
2710: 0a 20 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20  .  u32 magic;   
2720: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
2730: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
2740: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
2750: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e   */.#endif.  HAN
2760: 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68  DLE hHeap; /* Th
2770: 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20  e handle to our 
2780: 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20  heap. */.  BOOL 
2790: 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77  bOwned;  /* Do w
27a0: 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28  e own the heap (
27b0: 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20  i.e. destroy it 
27c0: 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f  on shutdown)? */
27d0: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .};..#ifndef NDE
27e0: 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d  BUG.#define WINM
27f0: 45 4d 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34  EM_MAGIC     0x4
2800: 32 62 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a  2b2830b.#endif..
2810: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
2820: 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d  nMemData win_mem
2830: 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65  _data = {.#ifnde
2840: 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45  f NDEBUG.  WINME
2850: 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a  M_MAGIC,.#endif.
2860: 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b    NULL, FALSE.};
2870: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
2880: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
2890: 73 73 65 72 74 4d 61 67 69 63 28 29 20 61 73 73  ssertMagic() ass
28a0: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
28b0: 61 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f  a.magic==WINMEM_
28c0: 4d 41 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64  MAGIC ).#else.#d
28d0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
28e0: 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66  rtMagic().#endif
28f0: 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ..#define winMem
2900: 47 65 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65  GetHeap() win_me
2910: 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74  m_data.hHeap..st
2920: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
2930: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
2940: 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  es);.static void
2950: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
2960: 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69   *pPrior);.stati
2970: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
2980: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
2990: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b  or, int nBytes);
29a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
29b0: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b  emSize(void *p);
29c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
29d0: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
29e0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
29f0: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
2a00: 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20  ppData);.static 
2a10: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
2a20: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
2a30: 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69  ta);..const sqli
2a40: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
2a50: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
2a60: 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  n32(void);.#endi
2a70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
2a80: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
2a90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2aa0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f   variable is (no
2ab0: 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65  rmally) set once
2ac0: 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67   and never chang
2ad0: 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72  es.** thereafter
2ae0: 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68  .  It records wh
2af0: 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74  ether the operat
2b00: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
2b10: 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e  n9x.** or WinNT.
2b20: 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72  .**.** 0:   Oper
2b30: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b  ating system unk
2b40: 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70  nown..** 1:   Op
2b50: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2b60: 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20  s Win9x..** 2:  
2b70: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
2b80: 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  m is WinNT..**.*
2b90: 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  * In order to fa
2ba0: 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67  cilitate testing
2bb0: 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74   on a WinNT syst
2bc0: 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78  em, the test fix
2bd0: 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75  ture.** can manu
2be0: 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61  ally set this va
2bf0: 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c  lue to 1 to emul
2c00: 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69  ate Win98 behavi
2c10: 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  or..*/.#ifdef SQ
2c20: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
2c30: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
2c40: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
2c50: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
2c60: 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ype = 0;.#endif.
2c70: 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c  .#ifndef SYSCALL
2c80: 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43 41  .#  define SYSCA
2c90: 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  LL sqlite3_sysca
2ca0: 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f  ll_ptr.#endif../
2cb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2cc0: 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  on is not availa
2cd0: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
2ce0: 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a  E or WinRT.. */.
2cf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2d00: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
2d10: 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e  S_WINRT.#  defin
2d20: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
2d30: 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23 65  NSI()       1.#e
2d40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  ndif../*.** Many
2d50: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2d60: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2d70: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2d80: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2d90: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2da0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2db0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2dc0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2dd0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2de0: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2df0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2e00: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2e10: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2e20: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2e30: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2e40: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2e50: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
2e60: 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e  _syscall {.  con
2e70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
2e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2e90: 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  me of the system
2ea0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
2eb0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
2ec0: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
2ed0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
2ee0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
2ef0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
2f00: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
2f10: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
2f20: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
2f30: 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45   = {.#if !SQLITE
2f40: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
2f50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2f60: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
2f70: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
2f80: 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69  SCALL)AreFileApi
2f90: 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30  sANSI,         0
2fa0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41   },.#else.  { "A
2fb0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c  reFileApisANSI",
2fc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2fd0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2fe0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2ff0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
3000: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
3010: 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46  I.#define osAreF
3020: 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f  ileApisANSI ((BO
3030: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  OL(WINAPI*)(VOID
3040: 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43  ))aSyscall[0].pC
3050: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
3060: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3070: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
3080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3090: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c  WIDE).  { "CharL
30a0: 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  owerW",         
30b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
30c0: 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20  arLowerW,       
30d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
30e0: 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72  e.  { "CharLower
30f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3100: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3130: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f  #define osCharLo
3140: 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  werW ((LPWSTR(WI
3150: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
3160: 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72  Syscall[1].pCurr
3170: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3180: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
3190: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
31a0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
31b0: 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20  "CharUpperW",   
31c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
31d0: 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20  ALL)CharUpperW, 
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
31f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61  ,.#else.  { "Cha
3200: 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20  rUpperW",       
3210: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3220: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3230: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3240: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3250: 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50 57  CharUpperW ((LPW
3260: 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57  STR(WINAPI*)(LPW
3270: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d  STR))aSyscall[2]
3280: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3290: 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20  "CloseHandle",  
32a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
32b0: 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c  ALL)CloseHandle,
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
32d0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f  ,..#define osClo
32e0: 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28  seHandle ((BOOL(
32f0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
3300: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
3310: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if 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 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3340: 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20  CreateFileA",   
3350: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3360: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20  LL)CreateFileA, 
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 72 65 61  .#else.  { "Crea
3390: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
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: 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e  reateFileA ((HAN
33f0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
3400: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
3410: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
3420: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3430: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
3440: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  DLE))aSyscall[4]
3450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3460: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3470: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3480: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3490: 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  E).  { "CreateFi
34a0: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
34b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
34c0: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
34d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
34e0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22   { "CreateFileW"
34f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3500: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3530: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
3540: 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  eW ((HANDLE(WINA
3550: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
3560: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
3570: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
3580: 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c  TTRIBUTES,DWORD,
3590: 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53  DWORD,HANDLE))aS
35a0: 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65  yscall[5].pCurre
35b0: 6e 74 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54  nt)..#if (!SQLIT
35c0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
35d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
35e0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
35f0: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
3600: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
3610: 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  AL)).  { "Create
3620: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
3630: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3640: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c  ateFileMappingA,
3650: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3660: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3670: 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20  MappingA",      
3680: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
36b0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
36c0: 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41  ileMappingA ((HA
36d0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
36e0: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
36f0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
3700: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
3710: 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29  D,DWORD,LPCSTR))
3720: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
3730: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3740: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21  E_OS_WINCE || (!
3750: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3760: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3770: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3780: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21  ) && \.        !
3790: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
37a0: 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43  MIT_WAL)).  { "C
37b0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
37c0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
37d0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
37e0: 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingW,      0 },.
37f0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3800: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
3810: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3840: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3850: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3860: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3870: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55  *)(HANDLE,LPSECU
3880: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
3890: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
38a0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43  ,DWORD,DWORD,LPC
38b0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
38c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
38d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
38e0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
38f0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3900: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  DE).  { "CreateM
3910: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
3920: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3930: 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20  teMutexW,       
3940: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3950: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
3960: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
3970: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
39a0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75  efine osCreateMu
39b0: 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  texW ((HANDLE(WI
39c0: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
39d0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f  Y_ATTRIBUTES,BOO
39e0: 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  L, \.        LPC
39f0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38  WSTR))aSyscall[8
3a00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3a10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3a20: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
3a30: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
3a40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3a50: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
3a60: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  leA,            
3a70: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3a80: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
3a90: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3aa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3ac0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3ad0: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20  e osDeleteFileA 
3ae0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3af0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
3b00: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
3b10: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3b20: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3b30: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
3b40: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3b50: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
3b60: 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20  FileW,          
3b70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3b80: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3ba0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3bc0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3bd0: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
3be0: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
3bf0: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
3c00: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
3c10: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
3c20: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
3c30: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3c40: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46  ime", (SYSCALL)F
3c50: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
3c60: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
3c70: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
3c80: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
3c90: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3cc0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
3cd0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
3ce0: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
3cf0: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
3d00: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
3d10: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
3d20: 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[11].pCurrent)
3d30: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3d40: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
3d50: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
3d60: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69  ,    (SYSCALL)Fi
3d70: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
3d80: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  me,    0 },.#els
3d90: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
3da0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
3db0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3de0: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
3df0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28  meToSystemTime (
3e00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
3e10: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
3e20: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
3e30: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
3e40: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3e50: 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75    { "FlushFileBu
3e60: 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28  ffers",        (
3e70: 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c  SYSCALL)FlushFil
3e80: 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20  eBuffers,       
3e90: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3ea0: 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
3eb0: 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  s ((BOOL(WINAPI*
3ec0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
3ed0: 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[13].pCurrent)
3ee0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3ef0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3f00: 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74  NSI).  { "Format
3f10: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
3f20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72      (SYSCALL)For
3f30: 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20  matMessageA,    
3f40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3f50: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
3f60: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
3f70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3fa0: 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d  define osFormatM
3fb0: 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28  essageA ((DWORD(
3fc0: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
3fd0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f  PCVOID,DWORD,DWO
3fe0: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
3ff0: 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73      DWORD,va_lis
4000: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d  t*))aSyscall[14]
4010: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4030: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4040: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4050: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
4060: 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73  YSCALL)FormatMes
4070: 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20  sageW,          
4080: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4090: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
40a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
40b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
40d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
40e0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
40f0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4100: 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44  *)(DWORD,LPCVOID
4110: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57  ,DWORD,DWORD,LPW
4120: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
4130: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
4140: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
4150: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
4160: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4170: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
4180: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4190: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
41a0: 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72  SYSCALL)FreeLibr
41b0: 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  ary,            
41c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
41d0: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
41e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
41f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4210: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4220: 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20  e osFreeLibrary 
4230: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4240: 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c  HMODULE))aSyscal
4250: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
4260: 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74  .  { "GetCurrent
4270: 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20  ProcessId",     
4280: 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72  (SYSCALL)GetCurr
4290: 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20  entProcessId,   
42a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
42b0: 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
42c0: 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49  essId ((DWORD(WI
42d0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
42e0: 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65  scall[17].pCurre
42f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4300: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
4310: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4320: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4330: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4340: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4350: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
4360: 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d  paceA,       0 }
4370: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4380: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c  DiskFreeSpaceA",
4390: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
43a0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
43b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
43c0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
43d0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
43e0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
43f0: 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44  )(LPCSTR,LPDWORD
4400: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
4410: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57  , \.        LPDW
4420: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38  ORD))aSyscall[18
4430: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4440: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
4450: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
4460: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4470: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4480: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
4490: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
44a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
44b0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
44c0: 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  W,       0 },.#e
44d0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
44e0: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
44f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4520: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
4530: 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28  iskFreeSpaceW ((
4540: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4550: 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  CWSTR,LPDWORD,LP
4560: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
4570: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
4580: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
4590: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
45a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
45b0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
45c0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
45d0: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
45e0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
45f0: 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20  ibutesA,      0 
4600: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4610: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
4620: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
4630: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4640: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4650: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4660: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
4670: 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esA ((DWORD(WINA
4680: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
4690: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
46a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
46b0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
46c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
46d0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
46e0: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
46f0: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
4700: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
4710: 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d  butesW,      0 }
4720: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4730: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
4740: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4750: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4760: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4770: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4780: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4790: 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sW ((DWORD(WINAP
47a0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
47b0: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
47c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
47d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
47e0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
47f0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
4800: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
4810: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4820: 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65  sExW,    0 },.#e
4830: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
4840: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
4850: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4880: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
4890: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
48a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
48b0: 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c  (LPCWSTR,GET_FIL
48c0: 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c  EEX_INFO_LEVELS,
48d0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49   \.        LPVOI
48e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  D))aSyscall[22].
48f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4900: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4910: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
4920: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4930: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53  SYSCALL)GetFileS
4940: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
4950: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4960: 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20  "GetFileSize",  
4970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4980: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
49a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
49b0: 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20  e osGetFileSize 
49c0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
49d0: 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29  (HANDLE,LPDWORD)
49e0: 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43  )aSyscall[23].pC
49f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4a00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
4a10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a20: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4a30: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
4a40: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
4a50: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
4a60: 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20  athNameA,       
4a70: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a80: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
4a90: 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  A",        (SYSC
4aa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ac0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ad0: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
4ae0: 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e  ameA ((DWORD(WIN
4af0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f  API*)(LPCSTR,DWO
4b00: 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20  RD,LPSTR, \.    
4b10: 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73      LPSTR*))aSys
4b20: 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e  call[24].pCurren
4b30: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4b40: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
4b50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4b60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4b70: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4b80: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4b90: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
4ba0: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
4bb0: 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20  thNameW,        
4bc0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4bd0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
4be0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4bf0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c10: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4c20: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
4c30: 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meW ((DWORD(WINA
4c40: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
4c50: 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  RD,LPWSTR, \.   
4c60: 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53       LPWSTR*))aS
4c70: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
4c80: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61  ent)..  { "GetLa
4c90: 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20  stError",       
4ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4cb0: 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
4cc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4cd0: 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72  fine osGetLastEr
4ce0: 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ror ((DWORD(WINA
4cf0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4d00: 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74  all[26].pCurrent
4d10: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
4d20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
4d30: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20  _EXTENSION).#if 
4d40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
4d50: 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63    /* The GetProc
4d60: 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69  AddressA() routi
4d70: 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ne is only avail
4d80: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
4d90: 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50  CE. */.  { "GetP
4da0: 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20  rocAddressA",   
4db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4dc0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20  etProcAddressA, 
4dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4de0: 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65  se.  /* All othe
4df0: 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f  r Windows platfo
4e00: 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72  rms expect GetPr
4e10: 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74  ocAddress() to t
4e20: 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49  ake.  ** an ANSI
4e30: 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65   string regardle
4e40: 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f  ss of the _UNICO
4e50: 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  DE setting */.  
4e60: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
4e70: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
4e80: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
4e90: 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30  ress,          0
4ea0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65   },.#endif.#else
4eb0: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64  .  { "GetProcAdd
4ec0: 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20  ressA",         
4ed0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4f00: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
4f10: 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52  AddressA ((FARPR
4f20: 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44  OC(WINAPI*)(HMOD
4f30: 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ULE, \.        L
4f40: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
4f50: 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  27].pCurrent)..#
4f60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4f70: 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NRT.  { "GetSyst
4f80: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
4f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
4fa0: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20  ystemInfo,      
4fb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4fc0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
4fd0: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
4fe0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5010: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
5020: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
5030: 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49  API*)(LPSYSTEM_I
5040: 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38  NFO))aSyscall[28
5050: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5060: 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22   "GetSystemTime"
5070: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5080: 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69  CALL)GetSystemTi
5090: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  me,           0 
50a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
50b0: 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f  tSystemTime ((VO
50c0: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59  ID(WINAPI*)(LPSY
50d0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
50e0: 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[29].pCurrent)
50f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5100: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53  _WINCE.  { "GetS
5110: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5120: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47  ime", (SYSCALL)G
5130: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5140: 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c  leTime, 0 },.#el
5150: 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  se.  { "GetSyste
5160: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
5170: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
51a0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
51b0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
51c0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
51d0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
51e0: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
51f0: 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[30].pCurrent)
5200: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5210: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
5220: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  NSI).  { "GetTem
5230: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5240: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5250: 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20  TempPathA,      
5260: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5270: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5280: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
5290: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
52c0: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
52d0: 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49  PathA ((DWORD(WI
52e0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53  NAPI*)(DWORD,LPS
52f0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d  TR))aSyscall[31]
5300: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5310: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5320: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5330: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
5340: 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  E).  { "GetTempP
5350: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5360: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
5370: 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20  mpPathW,        
5380: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5390: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
53a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
53b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
53e0: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
53f0: 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thW ((DWORD(WINA
5400: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54  PI*)(DWORD,LPWST
5410: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e  R))aSyscall[32].
5420: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5430: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5440: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5450: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
5460: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
5470: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
5480: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5490: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
54a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
54b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
54d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
54e0: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
54f0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5500: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
5510: 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [33].pCurrent)..
5520: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5530: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
5540: 49 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  I).  { "GetVersi
5550: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5560: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65    (SYSCALL)GetVe
5570: 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20  rsionExA,       
5580: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5590: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
55a0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
55b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
55e0: 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f  fine osGetVersio
55f0: 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nExA ((BOOL(WINA
5600: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5610: 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41  LPOSVERSIONINFOA
5620: 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70  ))aSyscall[34].p
5630: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
5640: 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  eapAlloc",      
5650: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5660: 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20  L)HeapAlloc,    
5670: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5680: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41  .#define osHeapA
5690: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
56a0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
56b0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
56c0: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
56d0: 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  35].pCurrent)..#
56e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
56f0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65  NRT.  { "HeapCre
5700: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
5710: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5720: 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
5730: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5740: 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22    { "HeapCreate"
5750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
5760: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5790: 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61  efine osHeapCrea
57a0: 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  te ((HANDLE(WINA
57b0: 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f  PI*)(DWORD,SIZE_
57c0: 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  T, \.        SIZ
57d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36  E_T))aSyscall[36
57e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
57f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5800: 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72  T.  { "HeapDestr
5810: 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oy",            
5820: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65   (SYSCALL)HeapDe
5830: 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20  stroy,          
5840: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5850: 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c  { "HeapDestroy",
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5870: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5890: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
58a0: 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f  ine osHeapDestro
58b0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
58c0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
58d0: 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[37].pCurrent)
58e0: 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22  ..  { "HeapFree"
58f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5900: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72   (SYSCALL)HeapFr
5910: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
5920: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5930: 20 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f   osHeapFree ((BO
5940: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5950: 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29  LE,DWORD,LPVOID)
5960: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
5970: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
5980: 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20  apReAlloc",     
5990: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
59a0: 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20  )HeapReAlloc,   
59b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
59c0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65  #define osHeapRe
59d0: 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57  Alloc ((LPVOID(W
59e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
59f0: 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20  WORD,LPVOID, \. 
5a00: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
5a10: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
5a20: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
5a30: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
5a40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5a50: 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20  eapSize,        
5a60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5a70: 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65  efine osHeapSize
5a80: 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49   ((SIZE_T(WINAPI
5a90: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5aa0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f   \.        LPCVO
5ab0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d  ID))aSyscall[40]
5ac0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5ad0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5ae0: 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61  .  { "HeapValida
5af0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5b00: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c  (SYSCALL)HeapVal
5b10: 69 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  idate,          
5b20: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5b30: 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c   "HeapValidate",
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5b50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5b70: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5b80: 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  ne osHeapValidat
5b90: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
5ba0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
5bb0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
5bc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e  D))aSyscall[41].
5bd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5be0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5bf0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
5c00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5c10: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
5c20: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  SION).  { "LoadL
5c30: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
5c40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
5c50: 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20  adLibraryA,     
5c60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5c70: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
5c80: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
5c90: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5cc0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
5cd0: 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45  braryA ((HMODULE
5ce0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
5cf0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70  ))aSyscall[42].p
5d00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5d10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5d20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5d30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5d40: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64   && \.        !d
5d50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5d60: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5d70: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
5d80: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
5d90: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
5da0: 69 62 72 61 72 79 57 2c 20 20 20 20 20 20 20 20  ibraryW,        
5db0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5dc0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
5dd0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5de0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5e10: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
5e20: 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryW ((HMODULE(WI
5e30: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
5e40: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
5e50: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5e60: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5e70: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5e90: 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20  CALL)LocalFree, 
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5eb0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
5ec0: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20  calFree",       
5ed0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ee0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5ef0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f00: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f10: 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f  sLocalFree ((HLO
5f20: 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f  CAL(WINAPI*)(HLO
5f30: 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 34  CAL))aSyscall[44
5f40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5f50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5f60: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
5f70: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46  WINRT.  { "LockF
5f80: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5f90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
5fa0: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
5fb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5fc0: 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  e.  { "LockFile"
5fd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fe0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6010: 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69  #ifndef osLockFi
6020: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  le.#define osLoc
6030: 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  kFile ((BOOL(WIN
6040: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6050: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
6060: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6070: 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43  )aSyscall[45].pC
6080: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
6090: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
60a0: 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  INCE.  { "LockFi
60b0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
60c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
60d0: 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20  kFileEx,        
60e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
60f0: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78  .  { "LockFileEx
6100: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6110: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6140: 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c  ifndef osLockFil
6150: 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  eEx.#define osLo
6160: 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28  ckFileEx ((BOOL(
6170: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6180: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6190: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
61a0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
61b0: 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43  )aSyscall[46].pC
61c0: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
61d0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
61e0: 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f  NCE || (!SQLITE_
61f0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
6200: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6210: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56  _WAL)).  { "MapV
6220: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
6230: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d        (SYSCALL)M
6240: 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20  apViewOfFile,   
6250: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6260: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
6270: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6280: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
62b0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
62c0: 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49  ewOfFile ((LPVOI
62d0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
62e0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
62f0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  ORD, \.        S
6300: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
6310: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  47].pCurrent).. 
6320: 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57   { "MultiByteToW
6330: 69 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53  ideChar",     (S
6340: 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65  YSCALL)MultiByte
6350: 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20  ToWideChar,     
6360: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6370: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
6380: 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49  har ((int(WINAPI
6390: 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50  *)(UINT,DWORD,LP
63a0: 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c  CSTR,int,LPWSTR,
63b0: 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29   \.        int))
63c0: 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75  aSyscall[48].pCu
63d0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65  rrent)..  { "Que
63e0: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
63f0: 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29  nter", (SYSCALL)
6400: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
6410: 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23  Counter, 0 },..#
6420: 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65  define osQueryPe
6430: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
6440: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6450: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47  ( \.        LARG
6460: 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73  E_INTEGER*))aSys
6470: 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e  call[49].pCurren
6480: 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c  t)..  { "ReadFil
6490: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
64a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64     (SYSCALL)Read
64b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
64c0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
64d0: 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28  ne osReadFile ((
64e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
64f0: 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52  NDLE,LPVOID,DWOR
6500: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
6510: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
6520: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e  D))aSyscall[50].
6530: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6540: 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20  SetEndOfFile",  
6550: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6560: 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c  LL)SetEndOfFile,
6570: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6580: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45  ..#define osSetE
6590: 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ndOfFile ((BOOL(
65a0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
65b0: 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43  )aSyscall[51].pC
65c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
65d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
65e0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
65f0: 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  r",          (SY
6600: 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69  SCALL)SetFilePoi
6610: 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30  nter,          0
6620: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
6630: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20  etFilePointer", 
6640: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6650: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6660: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6670: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6680: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
6690: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
66a0: 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c  )(HANDLE,LONG,PL
66b0: 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ONG, \.        D
66c0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
66d0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
66e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
66f0: 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20  RT.  { "Sleep", 
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70    (SYSCALL)Sleep
6720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6730: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6740: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6760: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6790: 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56  fine osSleep ((V
67a0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  OID(WINAPI*)(DWO
67b0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d  RD))aSyscall[53]
67c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
67d0: 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  "SystemTimeToFil
67e0: 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43  eTime",    (SYSC
67f0: 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f  ALL)SystemTimeTo
6800: 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d  FileTime,    0 }
6810: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73  ,..#define osSys
6820: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
6830: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6840: 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49  )(CONST SYSTEMTI
6850: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
6860: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
6870: 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74  all[54].pCurrent
6880: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6890: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
68a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
68b0: 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  "UnlockFile",   
68c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
68d0: 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20  ALL)UnlockFile, 
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
68f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c  ,.#else.  { "Unl
6900: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
6910: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6920: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6930: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6940: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
6950: 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  UnlockFile.#defi
6960: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20  ne osUnlockFile 
6970: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6980: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6990: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
69a0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
69b0: 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74  all[55].pCurrent
69c0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ).#endif..#if !S
69d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
69e0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   { "UnlockFileEx
69f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6a00: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
6a10: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  eEx,            
6a20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a30: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20  UnlockFileEx",  
6a40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6a80: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20   osUnlockFileEx 
6a90: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6aa0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6ab0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6ac0: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
6ad0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70  ))aSyscall[56].p
6ae0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6af0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
6b00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6b10: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22  _OMIT_WAL).  { "
6b20: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
6b30: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
6b40: 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  LL)UnmapViewOfFi
6b50: 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  le,         0 },
6b60: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61  .#else.  { "Unma
6b70: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
6b80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6b90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6ba0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6bb0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55  dif..#define osU
6bc0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  nmapViewOfFile (
6bd0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
6be0: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
6bf0: 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [57].pCurrent)..
6c00: 20 20 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d    { "WideCharToM
6c10: 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20 20 28  ultiByte",     (
6c20: 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72  SYSCALL)WideChar
6c30: 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20  ToMultiByte,    
6c40: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6c50: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
6c60: 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50  Byte ((int(WINAP
6c70: 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c  I*)(UINT,DWORD,L
6c80: 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52  PCWSTR,int,LPSTR
6c90: 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20  ,int, \.        
6ca0: 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61  LPCSTR,LPBOOL))a
6cb0: 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72  Syscall[58].pCur
6cc0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74  rent)..  { "Writ
6cd0: 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  eFile",         
6ce0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57        (SYSCALL)W
6cf0: 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20  riteFile,       
6d00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
6d10: 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c  efine osWriteFil
6d20: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6d30: 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44  )(HANDLE,LPCVOID
6d40: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
6d50: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
6d60: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
6d70: 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [59].pCurrent)..
6d80: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6d90: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45  NRT.  { "CreateE
6da0: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
6db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
6dc0: 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20  teEventExW,     
6dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6de0: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74    { "CreateEvent
6df0: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  ExW",          (
6e00: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6e30: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76  efine osCreateEv
6e40: 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28  entExW ((HANDLE(
6e50: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
6e60: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c  ITY_ATTRIBUTES,L
6e70: 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  PCWSTR, \.      
6e80: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61    DWORD,DWORD))a
6e90: 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72  Syscall[60].pCur
6ea0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6eb0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6ec0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
6ed0: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
6ee0: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
6ef0: 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d  eObject,     0 }
6f00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69  ,.#else.  { "Wai
6f10: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6f20: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6f30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6f40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6f50: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6f60: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6f70: 65 63 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ect ((DWORD(WINA
6f80: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
6f90: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
6fa0: 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72  yscall[61].pCurr
6fb0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
6fc0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
6fd0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6fe0: 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c  ctEx",   (SYSCAL
6ff0: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
7000: 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a  bjectEx,   0 },.
7010: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
7020: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
7030: 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ",   (SYSCALL)0,
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7060: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
7070: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7080: 74 45 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41  tEx ((DWORD(WINA
7090: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
70a0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f  D, \.        BOO
70b0: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e  L))aSyscall[62].
70c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
70d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
70e0: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
70f0: 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53  erEx",        (S
7100: 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f  YSCALL)SetFilePo
7110: 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20 20 20  interEx,        
7120: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7130: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
7140: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
7150: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7160: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7170: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7180: 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
7190: 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  rEx ((BOOL(WINAP
71a0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45  I*)(HANDLE,LARGE
71b0: 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20  _INTEGER, \.    
71c0: 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47      PLARGE_INTEG
71d0: 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  ER,DWORD))aSysca
71e0: 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[63].pCurrent)
71f0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7200: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69  WINRT.  { "GetFi
7210: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7220: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
7230: 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  LL)GetFileInform
7240: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c  ationByHandleEx,
7250: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7260: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
7270: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
7280: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
72a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
72b0: 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  e osGetFileInfor
72c0: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
72d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
72e0: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
72f0: 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f     FILE_INFO_BY_
7300: 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56  HANDLE_CLASS,LPV
7310: 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63  OID,DWORD))aSysc
7320: 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74  all[64].pCurrent
7330: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7340: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
7350: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
7360: 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  AL).  { "MapView
7370: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20  OfFileFromApp", 
7380: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
7390: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
73a0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
73b0: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
73c0: 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28  leFromApp",    (
73d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7400: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
7410: 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c  fFileFromApp ((L
7420: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
7430: 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  ANDLE,ULONG,ULON
7440: 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  G64, \.        S
7450: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
7460: 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  65].pCurrent)..#
7470: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7480: 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  RT.  { "CreateFi
7490: 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  le2",           
74a0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
74b0: 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20  eFile2,         
74c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
74d0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
74e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
74f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7520: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
7530: 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  e2 ((HANDLE(WINA
7540: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f  PI*)(LPCWSTR,DWO
7550: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
7560: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41  \.        LPCREA
7570: 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
7580: 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79  _PARAMETERS))aSy
7590: 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65  scall[66].pCurre
75a0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
75b0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
75c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
75d0: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
75e0: 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67  .  { "LoadPackag
75f0: 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  edLibrary",     
7600: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63  (SYSCALL)LoadPac
7610: 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20  kagedLibrary,   
7620: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7630: 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69   "LoadPackagedLi
7640: 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53  brary",     (SYS
7650: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7670: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7680: 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65  ne osLoadPackage
7690: 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55  dLibrary ((HMODU
76a0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
76b0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
76c0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
76d0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
76e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
76f0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
7700: 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  unt64",         
7710: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
7720: 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20  kCount64,       
7730: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7740: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  { "GetTickCount6
7750: 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  4",          (SY
7760: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7780: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7790: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
77a0: 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47  nt64 ((ULONGLONG
77b0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
77c0: 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75  aSyscall[68].pCu
77d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
77e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
77f0: 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  "GetNativeSystem
7800: 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43  Info",     (SYSC
7810: 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73  ALL)GetNativeSys
7820: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d  temInfo,     0 }
7830: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
7840: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
7850: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
7860: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7870: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7880: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7890: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
78a0: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
78b0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
78c0: 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53  PSYSTEM_INFO))aS
78d0: 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72  yscall[69].pCurr
78e0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
78f0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
7900: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75  AS_ANSI).  { "Ou
7910: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7920: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
7930: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
7940: 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngA,      0 },.#
7950: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
7960: 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20  DebugStringA",  
7970: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
79a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
79b0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20  putDebugStringA 
79c0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
79d0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
79e0: 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [70].pCurrent)..
79f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
7a00: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
7a10: 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  E).  { "OutputDe
7a20: 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20  bugStringW",    
7a30: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
7a40: 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20  tDebugStringW,  
7a50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7a60: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
7a70: 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  tringW",      (S
7a80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7ab0: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
7ac0: 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44  ugStringW ((VOID
7ad0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7ae0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e  R))aSyscall[71].
7af0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7b00: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c  GetProcessHeap",
7b10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7b20: 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61  LL)GetProcessHea
7b30: 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  p,          0 },
7b40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
7b50: 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e  rocessHeap ((HAN
7b60: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  DLE(WINAPI*)(VOI
7b70: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e  D))aSyscall[72].
7b80: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7b90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
7ba0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
7bb0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20  E_OMIT_WAL).  { 
7bc0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
7bd0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
7be0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
7bf0: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30  appingFromApp, 0
7c00: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
7c10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
7c20: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
7c30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7c50: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7c60: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
7c70: 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e  ingFromApp ((HAN
7c80: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
7c90: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
7ca0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
7cb0: 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  UTES,ULONG,ULONG
7cc0: 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73  64,LPCWSTR))aSys
7cd0: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
7ce0: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
7cf0: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
7d00: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
7d10: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
7d20: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
7d30: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
7d40: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
7d50: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
7d60: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
7d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
7d80: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
7d90: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
7da0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
7db0: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
7dc0: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
7dd0: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
7de0: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
7df0: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
7e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7e10: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
7e20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
7e30: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
7e40: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
7e50: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
7e60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7e70: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
7e80: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
7e90: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
7ea0: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
7eb0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
7ec0: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
7ed0: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
7ee0: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
7ef0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
7f00: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
7f10: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
7f20: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7f30: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
7f40: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
7f50: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
7f60: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
7f70: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
7f80: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
7f90: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
7fa0: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
7fb0: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
7fc0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
7fd0: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
7fe0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
7ff0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
8000: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
8010: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
8020: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
8030: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8040: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
8050: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8060: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
8070: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8080: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
8090: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
80a0: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
80b0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
80c0: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
80d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
80e0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
80f0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8100: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8110: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
8120: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
8130: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
8140: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
8150: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
8160: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
8170: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
8180: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
8190: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
81a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
81b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
81c0: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
81d0: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
81e0: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
81f0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
8200: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
8210: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
8220: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
8230: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8240: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8250: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
8260: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
8270: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
8280: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8290: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
82a0: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
82b0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
82c0: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
82d0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
82e0: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
82f0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
8300: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
8310: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
8320: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
8330: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8340: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
8350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8360: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
8370: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
8380: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
8390: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
83a0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
83b0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
83c0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
83d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
83e0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
83f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
8400: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
8410: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
8420: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8430: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
8440: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
8450: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
8460: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
8470: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
8480: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
8490: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
84a0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
84b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
84c0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
84d0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
84e0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
84f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
8500: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
8510: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
8520: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
8530: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
8540: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
8550: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
8560: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
8570: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8580: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
8590: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
85a0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
85b0: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
85c0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
85d0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
85e0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
85f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
8600: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
8610: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
8620: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
8630: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8640: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
8650: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
8660: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
8670: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
8680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70  is function outp
8690: 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65  uts the specifie
86a0: 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20  d (ANSI) string 
86b0: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62  to the Win32 deb
86c0: 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61  ugger.** (if ava
86d0: 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69  ilable)..*/..voi
86e0: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
86f0: 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73  write_debug(cons
8700: 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e  t char *zBuf, in
8710: 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20  t nBuf){.  char 
8720: 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57  zDbgBuf[SQLITE_W
8730: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
8740: 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d  E];.  int nMin =
8750: 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49   MIN(nBuf, (SQLI
8760: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
8770: 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20  _SIZE - 1)); /* 
8780: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
8790: 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d   */.  if( nMin<-
87a0: 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f  1 ) nMin = -1; /
87b0: 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76  * all negative v
87c0: 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e  alues become -1.
87d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   */.  assert( nM
87e0: 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d  in==-1 || nMin==
87f0: 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45  0 || nMin<SQLITE
8800: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
8810: 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e  IZE );.#if defin
8820: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8830: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
8840: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
8850: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
8860: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
8870: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
8880: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
8890: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
88a0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
88b0: 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b  tringA(zDbgBuf);
88c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73  .  }else{.    os
88d0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
88e0: 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  gA(zBuf);.  }.#e
88f0: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
8900: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
8910: 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  E).  memset(zDbg
8920: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
8930: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
8940: 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c  E);.  if ( osMul
8950: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
8960: 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72  (.          osAr
8970: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
8980: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
8990: 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20  MCP, 0, zBuf,.  
89a0: 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c          nMin, (L
89b0: 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53  PWSTR)zDbgBuf, S
89c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
89d0: 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28  BUF_SIZE/sizeof(
89e0: 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20  WCHAR))<=0 ){.  
89f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8a00: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
8a10: 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44  ingW((LPCWSTR)zD
8a20: 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20  bgBuf);.#else.  
8a30: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
8a40: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
8a50: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
8a60: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
8a70: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
8a80: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
8a90: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
8aa0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67  derr, "%s", zDbg
8ab0: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
8ac0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8ad0: 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  r, "%s", zBuf);.
8ae0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
8af0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8b00: 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e  g routine suspen
8b10: 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ds the current t
8b20: 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61  hread for at lea
8b30: 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65  st ms.** millise
8b40: 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20  conds.  This is 
8b50: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
8b60: 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20  e Win32 Sleep() 
8b70: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
8b80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8b90: 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20  T.static HANDLE 
8ba0: 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
8bb0: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
8bc0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
8bd0: 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63  p(DWORD millisec
8be0: 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54  onds){.#if SQLIT
8bf0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20  E_OS_WINRT.  if 
8c00: 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c  ( sleepObj==NULL
8c10: 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a   ){.    sleepObj
8c20: 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74   = osCreateEvent
8c30: 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ExW(NULL, NULL, 
8c40: 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e  CREATE_EVENT_MAN
8c50: 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20  UAL_RESET,.     
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
8c80: 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61  RONIZE);.  }.  a
8c90: 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21  ssert( sleepObj!
8ca0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69  =NULL );.  osWai
8cb0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8cc0: 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c  Ex(sleepObj, mil
8cd0: 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45  liseconds, FALSE
8ce0: 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65  );.#else.  osSle
8cf0: 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  ep(milliseconds)
8d00: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
8d10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
8d20: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
8d30: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
8d40: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
8d50: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
8d60: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
8d70: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
8d80: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
8d90: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
8da0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
8db0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
8dc0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
8dd0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
8de0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
8df0: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
8e00: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
8e10: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
8e20: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
8e30: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
8e40: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
8e50: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
8e60: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
8e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
8e80: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
8e90: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
8ea0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
8eb0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
8ec0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
8ed0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
8ee0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
8ef0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
8f00: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
8f10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8f20: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
8f30: 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69  S_WINRT || !defi
8f40: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8f50: 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66  _HAS_ANSI).# def
8f60: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
8f70: 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  ).#elif !defined
8f80: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
8f90: 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65  S_WIDE).# define
8fa0: 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23   osIsNT()  (0).#
8fb0: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e  else.  static in
8fc0: 74 20 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b 0a  t osIsNT(void){.
8fd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
8fe0: 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  os_type==0 ){.  
8ff0: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
9000: 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  OA sInfo;.      
9010: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
9020: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
9030: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  of(sInfo);.     
9040: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
9050: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (&sInfo);.      
9060: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
9070: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
9080: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
9090: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
90a0: 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  : 1;.    }.    r
90b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73  eturn sqlite3_os
90c0: 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65  _type==2;.  }.#e
90d0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
90e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
90f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9100: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
9110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9120: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
9130: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
9140: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
9150: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
9160: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
9170: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
9180: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
9190: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
91a0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
91b0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
91c0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
91d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
91e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
91f0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
9200: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20  IDATE).  assert 
9210: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
9220: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
9230: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9240: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
9250: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9260: 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73  s>=0 );.  p = os
9270: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
9280: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9290: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
92a0: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28  T)nBytes);.  if(
92b0: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
92c0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
92d0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
92e0: 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74  HeapAlloc %u byt
92f0: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
9300: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9310: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
9320: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
9330: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
9340: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
9350: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
9360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9370: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
9380: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
9390: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
93a0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
93b0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
93c0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
93d0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
93e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
93f0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
9400: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
9410: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
9420: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
9430: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
9440: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
9450: 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69  ert ( osHeapVali
9460: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
9470: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9480: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
9490: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50  #endif.  if( !pP
94a0: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f  rior ) return; /
94b0: 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74  * Passing NULL t
94c0: 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e  o HeapFree is un
94d0: 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66  defined. */.  if
94e0: 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48  ( !osHeapFree(hH
94f0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9500: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
9510: 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  rior) ){.    sql
9520: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9530: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
9540: 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b  o HeapFree block
9550: 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25   %p (%d), heap=%
9560: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9570: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
9580: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
9590: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
95a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
95b0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
95c0: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
95d0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
95e0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
95f0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
9600: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
9610: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
9620: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
9630: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
9640: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
9650: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9660: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
9670: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
9680: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
9690: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
96a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
96b0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
96c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
96d0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
96e0: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
96f0: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
9700: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9710: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
9720: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
9730: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
9740: 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  ;.  if( !pPrior 
9750: 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  ){.    p = osHea
9760: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
9770: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9780: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
9790: 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Bytes);.  }else{
97a0: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52  .    p = osHeapR
97b0: 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  eAlloc(hHeap, SQ
97c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
97d0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28  FLAGS, pPrior, (
97e0: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
97f0: 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a    }.  if( !p ){.
9800: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9810: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
9820: 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62  ailed to %s %u b
9830: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
9840: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9850: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
9860: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
9870: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
9880: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
9890: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
98a0: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
98b0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
98c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
98d0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
98e0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
98f0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
9900: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
9910: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
9920: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
9930: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
9940: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
9950: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
9960: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
9970: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
9980: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
9990: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
99a0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
99b0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
99c0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
99d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
99e0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
99f0: 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f  TE).  assert ( o
9a00: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
9a10: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9a20: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
9a30: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
9a40: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
9a50: 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53  0;.  n = osHeapS
9a60: 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ize(hHeap, SQLIT
9a70: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9a80: 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d  GS, p);.  if( n=
9a90: 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20  =(SIZE_T)-1 ){. 
9aa0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
9ab0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
9ac0: 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65  iled to HeapSize
9ad0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20   block %p (%d), 
9ae0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
9af0: 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47            p, osG
9b00: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9b10: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9b20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9b30: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b    return (int)n;
9b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20  .}../*.** Round 
9b50: 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a  up a request siz
9b60: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  e to the next va
9b70: 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  lid allocation s
9b80: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
9b90: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
9ba0: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
9bb0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n n;.}../*.** In
9bc0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
9bd0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
9be0: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
9bf0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
9c00: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
9c10: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
9c20: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
9c30: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
9c40: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
9c50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9c60: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
9c70: 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e  Data->magic==WIN
9c80: 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23 69  MEM_MAGIC );..#i
9c90: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
9ca0: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
9cb0: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20  32_HEAP_CREATE. 
9cc0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
9cd0: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
9ce0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9cf0: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
9d00: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
9d10: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9d50: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20  AP_INIT_SIZE,.  
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
9d90: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b  _HEAP_MAX_SIZE);
9da0: 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65  .    if( !pWinMe
9db0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
9dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
9dd0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
9de0: 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65            "faile
9df0: 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20  d to HeapCreate 
9e00: 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  (%d), flags=%u, 
9e10: 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78  initSize=%u, max
9e20: 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20  Size=%u",.      
9e30: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
9e40: 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e  or(), SQLITE_WIN
9e50: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
9e60: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
9e70: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
9e80: 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e  SIZE, SQLITE_WIN
9e90: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
9ea0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9eb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9ec0: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
9ed0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
9ee0: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
9ef0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
9f00: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
9f10: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
9f20: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
9f30: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
9f40: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
9f50: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
9f60: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9f70: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
9f80: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
9f90: 63 65 73 73 48 65 61 70 20 28 25 64 29 22 2c 20  cessHeap (%d)", 
9fa0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9fb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
9fc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
9fd0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
9fe0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
9ff0: 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65   assert( !pWinMe
a000: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
a010: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
a020: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
a030: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
a040: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
a050: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
a060: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
a070: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
a080: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
a090: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
a0a0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
a0b0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
a0c0: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
a0d0: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
a0e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
a0f0: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
a100: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
a110: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a120: 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Deinitialize t
a130: 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  his module..*/.s
a140: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
a150: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
a160: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
a170: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
a180: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
a190: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
a1a0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
a1b0: 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ta ) return;.  i
a1c0: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
a1d0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73  hHeap ){.    ass
a1e0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
a1f0: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
a200: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
a210: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
a220: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
a230: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
a240: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
a250: 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61     assert( osHea
a260: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
a270: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
a280: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
a290: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
a2a0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
a2b0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
a2c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ed ){.      if( 
a2d0: 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70  !osHeapDestroy(p
a2e0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
a2f0: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p) ){.        sq
a300: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a310: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
a320: 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28  to HeapDestroy (
a330: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
a360: 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e  r(), (void*)pWin
a370: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b  MemData->hHeap);
a380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a390: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
a3a0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
a3b0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
a3c0: 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b  a->hHeap = NULL;
a3d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
a3e0: 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c  pulate the low-l
a3f0: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
a400: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  cation function 
a410: 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73  pointers in.** s
a420: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
a430: 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65  ig.m with pointe
a440: 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  rs to the routin
a450: 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  es in this file.
a460: 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   The.** argument
a470: 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c  s specify the bl
a480: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
a490: 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   manage..**.** T
a4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
a4b0: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
a4c0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20  lite3_config(), 
a4d0: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a  and therefore.**
a4e0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
a4f0: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
a500: 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a  e (it is not)..*
a510: 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
a520: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
a530: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
a540: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
a550: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
a560: 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d  m_methods winMem
a570: 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20  Methods = {.    
a580: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20  winMemMalloc,.  
a590: 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20    winMemFree,.  
a5a0: 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c    winMemRealloc,
a5b0: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c  .    winMemSize,
a5c0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64  .    winMemRound
a5d0: 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e  up,.    winMemIn
a5e0: 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68  it,.    winMemSh
a5f0: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e  utdown,.    &win
a600: 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20  _mem_data.  };. 
a610: 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d   return &winMemM
a620: 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20  ethods;.}..void 
a630: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
a640: 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71  ault(void){.  sq
a650: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
a660: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
a670: 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  C, sqlite3MemGet
a680: 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64  Win32());.}.#end
a690: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
a6a0: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
a6b0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
a6c0: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  F-8 string to Mi
a6d0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
a6e0: 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a  (UTF-16?). .**.*
a6f0: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
a700: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
a710: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
a720: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
a730: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
a740: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  nUtf8ToUnicode(c
a750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
a760: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
a770: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
a780: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
a790: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
a7a0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
a7b0: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
a7c0: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
a7d0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
a7e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a7f0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
a800: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
a810: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72  allocZero( nChar
a820: 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c  *sizeof(zWideFil
a830: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
a840: 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  f( zWideFilename
a850: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a860: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
a870: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
a880: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
a890: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
a8a0: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
a8b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
a8e0: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
a8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
a900: 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
a910: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
a920: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a930: 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
a940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
a950: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
a960: 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ode to UTF-8.  S
a970: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
a980: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
a990: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
a9a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
a9b0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
a9c0: 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64   char *winUnicod
a9d0: 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20  eToUtf8(LPCWSTR 
a9e0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
a9f0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
aa00: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
aa10: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
aa20: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
aa30: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
aa40: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
aa50: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
aa60: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
aa70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
aa80: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
aa90: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
aaa0: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
aab0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
aac0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
aad0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
aae0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
aaf0: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
ab00: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
ab10: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  -1, zFilename, n
ab20: 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
ab50: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
ab60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ab70: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ab80: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
ab90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
aba0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
abb0: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53  * Convert an ANS
abc0: 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  I string to Micr
abd0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62  osoft Unicode, b
abe0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
abf0: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
ac00: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
ac10: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
ac20: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
ac30: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
ac40: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
ac50: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
ac60: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  loc..*/.static L
ac70: 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55  PWSTR winMbcsToU
ac80: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
ac90: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
aca0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50   int nByte;.  LP
acb0: 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61  WSTR zMbcsFilena
acc0: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
acd0: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
ace0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
acf0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
ad00: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
ad10: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
ad20: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
ad30: 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
ad40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
ad70: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
ad80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ad90: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69  0;.  }.  zMbcsFi
ada0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
adb0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
adc0: 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69  e*sizeof(zMbcsFi
add0: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
ade0: 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  if( zMbcsFilenam
adf0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
ae00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
ae10: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
ae20: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
ae30: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
ae40: 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e  , -1, zMbcsFilen
ae50: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69       nByte);.  i
ae80: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
ae90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
aea0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a  zMbcsFilename);.
aeb0: 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d      zMbcsFilenam
aec0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
aed0: 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  urn zMbcsFilenam
aee0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
aef0: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
af00: 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62  icode to multi-b
af10: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
af20: 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74  ring, based on t
af30: 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53  he.** user's ANS
af40: 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a  I codepage..**.*
af50: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
af60: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
af70: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
af80: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
af90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
afa0: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
afb0: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
afc0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
afd0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
afe0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
aff0: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
b000: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
b010: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
b020: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
b030: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
b040: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
b050: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
b060: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
b070: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
b080: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
b090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b0a0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
b0b0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
b0c0: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
b0d0: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
b0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b0f0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
b100: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
b110: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
b120: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
b130: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  1, zFilename,.  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
b160: 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  yte, 0, 0);.  if
b170: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
b180: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b190: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
b1a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
b1b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
b1c0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
b1d0: 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79   Convert multiby
b1e0: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
b1f0: 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ing to UTF-8.  S
b200: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
b210: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
b220: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
b230: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
b240: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
b250: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
b260: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
b270: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
b280: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
b290: 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53  nameUtf8;.  LPWS
b2a0: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
b2b0: 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62  zTmpWide = winMb
b2c0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  csToUnicode(zFil
b2d0: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54  ename);.  if( zT
b2e0: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
b2f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b300: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d   zFilenameUtf8 =
b310: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
b320: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
b330: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
b340: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
b350: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
b360: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
b370: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
b380: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
b390: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
b3a0: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
b3b0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
b3c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
b3d0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
b3e0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
b3f0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
b400: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
b410: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
b420: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
b430: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
b440: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
b450: 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
b460: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
b470: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
b480: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
b490: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
b4a0: 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63  meMbcs = winUnic
b4b0: 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69  odeToMbcs(zTmpWi
b4c0: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
b4d0: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
b4e0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
b4f0: 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMbcs;.}../*.** 
b500: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
b510: 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ts the data dire
b520: 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d  ctory or the tem
b530: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
b540: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
b550: 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65   provided argume
b560: 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 61  nts.  The type a
b570: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
b580: 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  1 in order to se
b590: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69  t the.** data di
b5a0: 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20  rectory or 2 in 
b5b0: 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65  order to set the
b5c0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
b5d0: 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75  tory.  The zValu
b5e0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  e.** argument is
b5f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b600: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73   directory to us
b610: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  e.  The return v
b620: 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  alue will be.** 
b630: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
b640: 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20  cessful..*/.int 
b650: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
b660: 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52  t_directory(DWOR
b670: 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20  D type, LPCWSTR 
b680: 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20  zValue){.  char 
b690: 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20  **ppDirectory = 
b6a0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
b6b0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
b6c0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
b6d0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
b6e0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
b6f0: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
b700: 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  if( type==SQLITE
b710: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
b720: 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20  CTORY_TYPE ){.  
b730: 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20    ppDirectory = 
b740: 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  &sqlite3_data_di
b750: 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65  rectory;.  }else
b760: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
b770: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
b780: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
b790: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
b7a0: 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   &sqlite3_temp_d
b7b0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20  irectory;.  }.  
b7c0: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
b7d0: 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51  tory || type==SQ
b7e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
b7f0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
b800: 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65           || type
b810: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
b820: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
b830: 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  PE.  );.  assert
b840: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
b850: 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  | sqlite3Memdebu
b860: 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72 65  gHasType(*ppDire
b870: 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48  ctory, MEMTYPE_H
b880: 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70  EAP) );.  if( pp
b890: 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
b8a0: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66   char *zValueUtf
b8b0: 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  8 = 0;.    if( z
b8c0: 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b  Value && zValue[
b8d0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c  0] ){.      zVal
b8e0: 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63  ueUtf8 = winUnic
b8f0: 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65  odeToUtf8(zValue
b900: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56  );.      if ( zV
b910: 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20  alueUtf8==0 ){. 
b920: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b930: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
b950: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69  lite3_free(*ppDi
b960: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70  rectory);.    *p
b970: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61  pDirectory = zVa
b980: 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74  lueUtf8;.    ret
b990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b9a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b9b0: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
b9c0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
b9d0: 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73  lue of winGetLas
b9e0: 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20  tErrorMsg.** is 
b9f0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
ba00: 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
ba10: 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
ba20: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
ba30: 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
ba40: 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
ba50: 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ated)..*/.static
ba60: 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
ba70: 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61  rrorMsg(DWORD la
ba80: 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75  stErrno, int nBu
ba90: 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
baa0: 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61    /* FormatMessa
bab0: 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20  ge returns 0 on 
bac0: 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77  failure.  Otherw
bad0: 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75  ise it.  ** retu
bae0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
baf0: 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e  f TCHARs written
bb00: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20   to the output. 
bb10: 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c   ** buffer, excl
bb20: 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e  uding the termin
bb30: 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e  ating null char.
bb40: 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  .  */.  DWORD dw
bb50: 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
bb60: 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66  *zOut = 0;..  if
bb70: 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
bb80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
bb90: 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d  T.    WCHAR zTem
bba0: 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e  pWide[SQLITE_WIN
bbb0: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
bbc0: 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65  ARS+1];.    dwLe
bbd0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
bbe0: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
bbf0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
bc00: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
bc20: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
bc30: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
bc60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
bc80: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c        zTempWide,
bcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
bcf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
bd00: 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20  RRMSG_CHARS,.   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
bd30: 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a  lse.    LPWSTR z
bd40: 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b  TempWide = NULL;
bd50: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
bd60: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
bd70: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
bd80: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_BUFFER |. 
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
bdb0: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
bdc0: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
bdf0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
be00: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
be90: 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65  WSTR) &zTempWide
bea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
bec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
bee0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
bef0: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
bf00: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
bf10: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
bf20: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
bf30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
bf40: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
bf50: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
bf60: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
bf70: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
bf80: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
bf90: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66  ignMalloc();.#if
bfa0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
bfb0: 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  T.      /* free 
bfc0: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
bfd0: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
bfe0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
bff0: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
c000: 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65  e(zTempWide);.#e
c010: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ndif.    }.  }.#
c020: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
c030: 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
c040: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  se{.    char *zT
c050: 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  emp = NULL;.    
c060: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
c070: 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f  MessageA(FORMAT_
c080: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
c090: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
c0c0: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
c0d0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
c100: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
c130: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20          (LPSTR) 
c1a0: 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20  &zTemp,.        
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
c1f0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
c200: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
c210: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
c220: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
c230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
c240: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
c250: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73  ;.      zOut = s
c260: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
c270: 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
c280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c290: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
c2a0: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
c2b0: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
c2c0: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
c2d0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
c2e0: 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65        osLocalFre
c2f0: 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a  e(zTemp);.    }.
c300: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c310: 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20   0 == dwLen ){. 
c320: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c330: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
c340: 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28  "OsError 0x%lx (
c350: 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  %lu)", lastErrno
c360: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
c370: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
c380: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
c390: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
c3a0: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
c3b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c3c0: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
c3d0: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
c3e0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
c3f0: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
c400: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
c410: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
c420: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
c430: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
c440: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
c450: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
c460: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
c470: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
c480: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
c490: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c4a0: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
c4b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
c4c0: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
c4d0: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
c4e0: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
c4f0: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
c500: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
c510: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
c520: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
c530: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
c540: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
c550: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a  ivalent from .**
c560: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a   FormatMessage..
c570: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
c580: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
c590: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
c5a0: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
c5b0: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
c5c0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
c5d0: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
c5e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
c5f0: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
c600: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
c610: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
c620: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
c630: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c640: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
c650: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
c660: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
c670: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
c680: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
c690: 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  ine winLogError(
c6a0: 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f  a,b,c,d)   winLo
c6b0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
c6c0: 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,c,d,__LINE__).s
c6d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67  tatic int winLog
c6e0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
c6f0: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c710: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
c720: 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ode */.  DWORD l
c730: 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20  astErrno,       
c740: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33           /* Win3
c750: 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a  2 last error */.
c760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
c770: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
c780: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
c790: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
c7a0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
c7b0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
c7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
c7d0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
c7e0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
c7f0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
c820: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
c830: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
c840: 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35  ){.  char zMsg[5
c850: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
c860: 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65       /* Human re
c870: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78  adable error tex
c880: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c8b0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73  ounter */..  zMs
c8c0: 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47  g[0] = 0;.  winG
c8d0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c  etLastErrorMsg(l
c8e0: 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66  astErrno, sizeof
c8f0: 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20  (zMsg), zMsg);. 
c900: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
c910: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
c920: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
c930: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f  zPath = "";.  fo
c940: 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26  r(i=0; zMsg[i] &
c950: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20  & zMsg[i]!='\r' 
c960: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27  && zMsg[i]!='\n'
c970: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b  ; i++){}.  zMsg[
c980: 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
c990: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
c9a0: 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25       "os_win.c:%
c9b0: 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29 20  d: (%lu) %s(%s) 
c9c0: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
c9d0: 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a  ne, lastErrno, z
c9e0: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73  Func, zPath, zMs
c9f0: 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  g.  );..  return
ca00: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
ca10: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
ca20: 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52 65   times that a Re
ca30: 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46  adFile(), WriteF
ca40: 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74  ile(), and Delet
ca50: 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20  eFile().** will 
ca60: 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f  be retried follo
ca70: 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65  wing a locking e
ca80: 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20  rror - probably 
ca90: 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  caused by .** an
caa0: 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
cab0: 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
cac0: 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
cad0: 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
cae0: 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
caf0: 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
cb00: 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
cb10: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
cb20: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
cb30: 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
cb40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
cb50: 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
cb60: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
cb70: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
cb80: 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
cb90: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
cba0: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
cbb0: 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
cbc0: 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
cbd0: 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  etry = SQLITE_WI
cbe0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b  N32_IOERR_RETRY;
cbf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
cc00: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
cc10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
cc20: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
cc30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
cc40: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
cc50: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
cc60: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
cc70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
cc80: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
cc90: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
cca0: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
ccb0: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
ccc0: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
ccd0: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
cce0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
ccf0: 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70  etryIoerr(int *p
cd00: 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70  nRetry, DWORD *p
cd10: 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20  Error){.  DWORD 
cd20: 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  e = osGetLastErr
cd30: 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52  or();.  if( *pnR
cd40: 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65  etry>=winIoerrRe
cd50: 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
cd60: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
cd70: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
cd80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
cd90: 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52    }.  if( e==ERR
cda0: 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
cdb0: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
cdc0: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
cdd0: 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  N ||.      e==ER
cde0: 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  ROR_SHARING_VIOL
cdf0: 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  ATION ){.    sql
ce00: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
ce10: 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65  (winIoerrRetryDe
ce20: 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
ce30: 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
ce40: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
ce50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72 6f  .  }.  if( pErro
ce60: 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72  r ){.    *pError
ce70: 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = e;.  }.  retu
ce80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
ce90: 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72  og a I/O error r
cea0: 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f  etry episode..*/
ceb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
cec0: 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65  LogIoerr(int nRe
ced0: 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74  try){.  if( nRet
cee0: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
cef0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45  3_log(SQLITE_IOE
cf00: 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61  RR, .      "dela
cf10: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
cf20: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
cf30: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f  ct",.      winIo
cf40: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
cf50: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
cf60: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
cf70: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
cf80: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
cf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
cfd0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
cfe0: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
cff0: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
d000: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d010: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
d020: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
d030: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
d040: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
d050: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
d060: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
d070: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
d080: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
d090: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
d0a0: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
d0b0: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
d0c0: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
d0d0: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
d0e0: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
d0f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
d100: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
d110: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
d120: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
d130: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
d140: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
d150: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
d160: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
d170: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
d180: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
d190: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
d1a0: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
d1b0: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
d1c0: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
d1d0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
d1e0: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
d1f0: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
d200: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
d210: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
d220: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
d230: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
d240: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
d250: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
d260: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
d270: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
d280: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
d290: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
d2a0: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
d2b0: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
d2c0: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
d2d0: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
d2e0: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
d2f0: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
d300: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
d310: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
d320: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
d330: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
d340: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
d350: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
d360: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
d370: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
d380: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
d390: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
d3a0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
d3b0: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
d3c0: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
d3d0: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
d3e0: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
d3f0: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
d400: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
d410: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
d420: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
d430: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
d440: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
d450: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
d460: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
d470: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
d480: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
d490: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
d4a0: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
d4b0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
d4c0: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
d4d0: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
d4e0: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
d4f0: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
d500: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
d510: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
d520: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
d530: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
d540: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
d550: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
d560: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
d570: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
d580: 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74  .  zName = winUt
d590: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
d5a0: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  ename);.  if( zN
d5b0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
d5c0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
d5d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
d5e0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
d5f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
d600: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
d610: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
d620: 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
d630: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
d640: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
d650: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
d660: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
d670: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
d680: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
d690: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
d6a0: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
d6b0: 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
d6c0: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
d6d0: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
d6e0: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
d6f0: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
d700: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
d710: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
d720: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
d730: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
d740: 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
d750: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
d760: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
d770: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
d780: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d790: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
d7a0: 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ror();.    sqlit
d7b0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
d7c0: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
d7d0: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
d7e0: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
d7f0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
d810: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
d820: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
d830: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
d840: 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65  the mutex before
d850: 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20   continuing */. 
d860: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
d870: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
d880: 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65  );.  .  /* Since
d890: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
d8a0: 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
d8b0: 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
d8c0: 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a  ppings etc are .
d8d0: 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74    ** case-sensit
d8e0: 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74  ive, take advant
d8f0: 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75  age of that by u
d900: 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d  ppercasing the m
d910: 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  utex name.  ** a
d920: 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73  nd using that as
d930: 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65   the shared file
d940: 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20  mapping name..  
d950: 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72  */.  osCharUpper
d960: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
d970: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43  e->hShared = osC
d980: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
d990: 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  W(INVALID_HANDLE
d9a0: 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20  _VALUE, NULL,.  
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57        PAGE_READW
d9e0: 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28  RITE, 0, sizeof(
d9f0: 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  winceLock),.    
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20      zName);  .. 
da30: 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74   /* Set a flag t
da40: 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 65  hat indicates we
da50: 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74 6f  're the first to
da60: 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f   create the memo
da70: 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d  ry so it .  ** m
da80: 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
da90: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
daa0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
dab0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
dac0: 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
dad0: 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
dae0: 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
daf0: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
db00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
db10: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
db20: 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
db30: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
db40: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
db50: 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
db60: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
db70: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
db80: 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
db90: 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
dba0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
dbb0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46   .             F
dbc0: 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c  ILE_MAP_READ|FIL
dbd0: 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20  E_MAP_WRITE, 0, 
dbe0: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
dbf0: 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ock));.    /* If
dc00: 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c   mapping failed,
dc10: 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65   close the share
dc20: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
dc30: 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a  and erase it */.
dc40: 20 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e      if( !pFile->
dc50: 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  shared ){.      
dc60: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
dc70: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
dc80: 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  r();.      winLo
dc90: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
dca0: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
dcb0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
dcc0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
dcd0: 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
dce0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
dcf0: 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
dd00: 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
dd10: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
dd20: 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d);.      pFile-
dd30: 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b  >hShared = NULL;
dd40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
dd50: 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   If shared memor
dd60: 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  y could not be c
dd70: 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f  reated, then clo
dd80: 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  se the mutex and
dd90: 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70   fail */.  if( p
dda0: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e  File->hShared==N
ddb0: 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
ddc0: 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20  bLogged ){.     
ddd0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
dde0: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
ddf0: 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
de00: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
de10: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
de20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de30: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
de40: 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock3", zFilename
de50: 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
de60: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
de70: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
de80: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
de90: 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
dea0: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
deb0: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
dec0: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
ded0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
dee0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20  TE_IOERR;.  }.  
def0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
df00: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
df10: 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70  ry if we're supp
df20: 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28  osed to */.  if(
df30: 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65   bInit ){.    me
df40: 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72  mset(pFile->shar
df50: 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  ed, 0, sizeof(wi
df60: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a  nceLock));.  }..
df70: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
df80: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
df90: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
dfa0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
dfb0: 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72   Destroy the par
dfc0: 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61  t of winFile tha
dfd0: 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e  t deals with win
dfe0: 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74  ce locks.*/.stat
dff0: 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73  ic void winceDes
e000: 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  troyLock(winFile
e010: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28   *pFile){.  if (
e020: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
e030: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74      /* Acquire t
e040: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20  he mutex */.    
e050: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
e060: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
e070: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
e080: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73  llowing blocks s
e090: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61  hould probably a
e0a0: 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d  ssert in debug m
e0b0: 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20  ode, but they.  
e0c0: 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61       are to clea
e0d0: 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20  nup in case any 
e0e0: 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f  locks remained o
e0f0: 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  pen */.    if (p
e100: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
e110: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69  ders){.      pFi
e120: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
e130: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ders --;.    }. 
e140: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e150: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a  cal.bReserved){.
e160: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
e170: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
e180: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
e190: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
e1a0: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
e1b0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e1c0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  d->bPending = FA
e1d0: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
e1e0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
e1f0: 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
e200: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
e210: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
e220: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ALSE;.    }..   
e230: 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65   /* De-reference
e240: 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63   and close our c
e250: 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65  opy of the share
e260: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
e270: 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69  */.    osUnmapVi
e280: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
e290: 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43  shared);.    osC
e2a0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
e2b0: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20  ->hShared);..   
e2c0: 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68   /* Done with th
e2d0: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
e2e0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
e2f0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e300: 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65      .    osClose
e310: 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
e320: 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
e330: 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
e340: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  .  }.}../* .** A
e350: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
e360: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
e370: 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  () API of Window
e380: 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
e390: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63  ic BOOL winceLoc
e3a0: 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
e3b0: 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
e3c0: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
e3d0: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
e3e0: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
e3f0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
e400: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
e410: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
e420: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
e430: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
e440: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
e450: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
e460: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
e470: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
e480: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
e490: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
e4a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e4b0: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
e4c0: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
e4d0: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
e4e0: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
e4f0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
e500: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
e510: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
e520: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
e530: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
e540: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
e550: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
e560: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
e570: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e580: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
e590: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
e5a0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
e5b0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
e5c0: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
e5d0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
e5e0: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
e5f0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e600: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
e610: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
e620: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
e630: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
e640: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
e650: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e660: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
e670: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
e680: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
e690: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
e6a0: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
e6b0: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
e6c0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
e6d0: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
e6e0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
e6f0: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
e700: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
e710: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
e720: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
e730: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
e740: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
e750: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e760: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
e770: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
e780: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
e790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
e7a0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
e7b0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e7c0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e7d0: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
e7e0: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
e7f0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e800: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
e810: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
e820: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
e830: 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
e840: 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
e850: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
e860: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
e870: 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
e880: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e890: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
e8a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
e8b0: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
e8c0: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
e8d0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e8e0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
e8f0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20   reserved lock? 
e900: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e910: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e920: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
e930: 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
e940: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
e950: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
e960: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
e970: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
e980: 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ved == 0) {.    
e990: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e9a0: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  >bReserved = TRU
e9b0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
e9c0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
e9d0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
e9e0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e9f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
ea00: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
ea10: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
ea20: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
ea30: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
ea40: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
ea50: 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20   UnlockFile API 
ea60: 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
ea70: 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
ea80: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
ea90: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
eaa0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
eab0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
eac0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
ead0: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
eae0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
eaf0: 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
eb00: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
eb10: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
eb20: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
eb30: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
eb40: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
eb50: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
eb60: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
eb70: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
eb80: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
eb90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
eba0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
ebb0: 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  oUnlockHigh);.. 
ebc0: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
ebd0: 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
ebe0: 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
ebf0: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
ec00: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  tex);..  /* Rele
ec10: 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c  asing a reader l
ec20: 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  ock or an exclus
ec30: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  ive lock */.  if
ec40: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
ec50: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
ec60: 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f  ED_FIRST){.    /
ec70: 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e  * Did we have an
ec80: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
ec90: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
eca0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
ecb0: 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ive){.      asse
ecc0: 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
ecd0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
ece0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
ecf0: 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ZE);.      pFile
ed00: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
ed10: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
ed20: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
ed30: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
ed40: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
ed50: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
ed60: 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  ..    /* Did we 
ed70: 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64  just have a read
ed80: 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  er lock? */.    
ed90: 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e  else if (pFile->
eda0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
edb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
edc0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
edd0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
ede0: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20  D)SHARED_SIZE.  
edf0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e             || nN
ee00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
ee10: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20  lockLow == 1);. 
ee20: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
ee30: 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
ee40: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
ee50: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
ee60: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
ee70: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
ee80: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
ee90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
eea0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
eeb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
eec0: 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
eed0: 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
eee0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
eef0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
ef00: 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
ef10: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
ef20: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
ef30: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
ef40: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
ef50: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
ef60: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
ef70: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
ef80: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
ef90: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
efa0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
efb0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
efc0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c    }.  }.  /* Rel
efd0: 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65  easing a reserve
efe0: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  d lock */.  else
eff0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
f000: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
f010: 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20  ESERVED_BYTE.   
f020: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
f030: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
f040: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
f050: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
f060: 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20  .bReserved) {.  
f070: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
f080: 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  .bReserved = FAL
f090: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
f0a0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
f0b0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
f0c0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
f0d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
f0e0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
f0f0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
f100: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
f110: 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  n;.}./*.** End o
f120: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f  f the special co
f130: 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a  de for wince.***
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
f190: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
f1a0: 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WINCE */../*.** 
f1b0: 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  Lock a file regi
f1c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  on..*/.static BO
f1d0: 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a  OL winLockFile(.
f1e0: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
f1f0: 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73  e,.  DWORD flags
f200: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
f210: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
f220: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
f230: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
f240: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
f250: 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
f260: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
f270: 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
f280: 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
f290: 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
f2a0: 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
f2b0: 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
f2c0: 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
f2d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  le..  */.  retur
f2e0: 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  n winceLockFile(
f2f0: 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
f300: 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  w, offsetHigh,. 
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
f330: 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
f340: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73  ;.#else.  if( os
f350: 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  IsNT() ){.    OV
f360: 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
f370: 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
f380: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
f390: 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
f3a0: 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
f3b0: 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
f3c0: 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
f3d0: 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
f3e0: 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28  rn osLockFileEx(
f3f0: 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  *phFile, flags, 
f400: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
f410: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
f420: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
f430: 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
f440: 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
f450: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
f460: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
f470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f480: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
f490: 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
f4a0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  f.}../*.** Unloc
f4b0: 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e  k a file region.
f4c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  . */.static BOOL
f4d0: 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a   winUnlockFile(.
f4e0: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
f4f0: 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  e,.  DWORD offse
f500: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
f510: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
f520: 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
f530: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
f540: 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
f550: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
f560: 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
f570: 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
f580: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
f590: 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
f5a0: 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
f5b0: 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63         API Unloc
f5c0: 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
f5d0: 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  turn winceUnlock
f5e0: 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
f5f0: 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
f600: 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
f620: 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
f630: 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
f640: 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
f650: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
f660: 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
f670: 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
f680: 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
f690: 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
f6a0: 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
f6b0: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
f6c0: 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
f6d0: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
f6e0: 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
f6f0: 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
f700: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
f710: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
f720: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
f730: 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  lockFile(*phFile
f740: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
f750: 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
f760: 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
f780: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
f790: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a  .#endif.}../****
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
f7f0: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72   next group of r
f800: 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e  outines implemen
f810: 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  t the I/O method
f820: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  s specified.** b
f830: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  y the sqlite3_io
f840: 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e  _methods object.
f850: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
f860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63  ../*.** Some Mic
f8b0: 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
f8c0: 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
f8d0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
f8e0: 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  f INVALID_SET_FI
f8f0: 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66  LE_POINTER.# def
f900: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  ine INVALID_SET_
f910: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44  FILE_POINTER ((D
f920: 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a  WORD)-1).#endif.
f930: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
f940: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
f950: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
f960: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
f970: 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
f980: 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69  ment to offset i
f990: 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  Offset within th
f9a0: 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  e file. If succe
f9b0: 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e  ssful, return 0.
f9c0: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
f9d0: 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  set pFile->lastE
f9e0: 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  rrno and return 
f9f0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
fa00: 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46  tic int winSeekF
fa10: 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
fa20: 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
fa30: 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20  4 iOffset){.#if 
fa40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
fa50: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
fa60: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
fa70: 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20     /* Most sig. 
fa80: 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
fa90: 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20  ffset */.  LONG 
faa0: 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20  lowerBits;      
fab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
fac0: 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ast sig. 32 bits
fad0: 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
fae0: 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b  /.  DWORD dwRet;
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
fb10: 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
fb20: 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44  Pointer() */.  D
fb30: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb50: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
fb60: 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
fb70: 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45  () */..  OSTRACE
fb80: 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
fb90: 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c   offset=%lld\n",
fba0: 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73   pFile->h, iOffs
fbb0: 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69  et));..  upperBi
fbc0: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
fbd0: 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
fbe0: 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
fbf0: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
fc00: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
fc10: 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
fc20: 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
fc30: 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
fc40: 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
fc50: 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e   dword .  ** con
fc60: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65  taining the lowe
fc70: 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65  r 32-bits of the
fc80: 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74   new file-offset
fc90: 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c  . Or, if it fail
fca0: 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72  s,.  ** it retur
fcb0: 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ns INVALID_SET_F
fcc0: 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77  ILE_POINTER. How
fcd0: 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  ever according t
fce0: 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e  o MSDN, .  ** IN
fcf0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
fd00: 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
fd10: 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
fd20: 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
fd30: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
fd40: 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61  ther an error ha
fd50: 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  s actually occur
fd60: 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20  red, it is also 
fd70: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c  necessary to cal
fd80: 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45  l .  ** GetLastE
fd90: 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64  rror()..  */.  d
fda0: 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  wRet = osSetFile
fdb0: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
fdc0: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
fdd0: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
fde0: 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77  GIN);..  if( (dw
fdf0: 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54  Ret==INVALID_SET
fe00: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20  _FILE_POINTER.  
fe10: 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
fe20: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fe30: 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
fe40: 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  )) ){.    pFile-
fe50: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
fe60: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
fe70: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
fe80: 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
fe90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
feb0: 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nSeekFile", pFil
fec0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f  e->zPath);.    O
fed0: 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
fee0: 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
fef0: 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20  _IOERR_SEEK\n", 
ff00: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
ff10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
ff20: 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
ff30: 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
ff40: 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
ff50: 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  >h));.  return 0
ff60: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a  ;.#else.  /*.  *
ff70: 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c  * Same as above,
ff80: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69   except that thi
ff90: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
ffa0: 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54   works for WinRT
ffb0: 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f  ..  */..  LARGE_
ffc0: 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20 20  INTEGER x;      
ffd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ffe0: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
fff0: 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20   BOOL bRet;     
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
10020 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
10030 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78  nterEx() */..  x
10040 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66  .QuadPart = iOff
10050 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73  set;.  bRet = os
10060 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
10070 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c  (pFile->h, x, 0,
10080 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20   FILE_BEGIN);.. 
10090 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20   if(!bRet){.    
100a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
100b0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
100c0 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  r();.    winLogE
100d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
100e0 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c  R_SEEK, pFile->l
100f0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
10100 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65            "winSe
10110 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ekFile", pFile->
10120 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52  zPath);.    OSTR
10130 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
10140 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
10150 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69  ERR_SEEK\n", pFi
10160 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
10170 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53  urn 1;.  }..  OS
10180 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
10190 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
101a0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
101b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  );.  return 0;.#
101c0 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c  endif.}..#if SQL
101d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
101e0 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  E>0./* Forward r
101f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53  eferences to VFS
10200 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20   helper methods 
10210 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20  used for memory 
10220 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a  mapped files */.
10230 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
10240 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20  pfile(winFile*, 
10250 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a  sqlite3_int64);.
10260 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
10270 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  mapfile(winFile*
10280 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
10290 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
102a0 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72  *.** It is repor
102b0 74 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65  ted that an atte
102c0 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68  mpt to close a h
102d0 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65  andle might some
102e0 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20  times.** fail.  
102f0 54 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75  This is a very u
10300 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75  nreasonable resu
10310 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20  lt, but Windows 
10320 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20  is notorious.** 
10330 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73  for being unreas
10340 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e  onable so I do n
10350 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74  ot doubt that it
10360 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20   might happen.  
10370 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20  If.** the close 
10380 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20  fails, we pause 
10390 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  for 100 millisec
103a0 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61  onds and try aga
103b0 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20  in.  As.** many 
103c0 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  as MX_CLOSE_ATTE
103d0 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20  MPT attempts to 
103e0 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65  close the handle
103f0 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65   are made before
10400 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e  .** giving up an
10410 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
10420 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rror..*/.#define
10430 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
10440 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77  T 3.static int w
10450 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  inClose(sqlite3_
10460 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
10470 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20   rc, cnt = 0;.  
10480 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10490 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
104a0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
104b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
104c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73  E_OMIT_WAL.  ass
104d0 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d  ert( pFile->pShm
104e0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
104f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68  assert( pFile->h
10500 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d  !=NULL && pFile-
10510 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  >h!=INVALID_HAND
10520 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53  LE_VALUE );.  OS
10530 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69  TRACE(("CLOSE fi
10540 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  le=%p\n", pFile-
10550 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  >h));..#if SQLIT
10560 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10570 30 0a 20 20 72 63 20 3d 20 77 69 6e 55 6e 6d 61  0.  rc = winUnma
10580 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20  pfile(pFile);.  
10590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
105a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  K ) return rc;.#
105b0 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20  endif..  do{.   
105c0 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e   rc = osCloseHan
105d0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
105e0 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f     /* SimulateIO
105f0 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74  Error( rc=0; cnt
10600 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50  =MX_CLOSE_ATTEMP
10610 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c  T; ); */.  }whil
10620 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
10630 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
10640 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33  EMPT && (sqlite3
10650 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
10660 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c  ), 1) );.#if SQL
10670 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65  ITE_OS_WINCE.#de
10680 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54  fine WINCE_DELET
10690 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20  ION_ATTEMPTS 3. 
106a0 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
106b0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  k(pFile);.  if( 
106c0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
106d0 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74  Close ){.    int
106e0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
106f0 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ile(.           
10700 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46  osDeleteFileW(pF
10710 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
10720 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
10730 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  && osGetFileAttr
10740 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a  ibutesW(pFile->z
10750 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d  DeleteOnClose)!=
10760 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20  0xffffffff .    
10770 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
10780 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
10790 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
107a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
107b0 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
107c0 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
107d0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
107e0 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
107f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10800 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
10810 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
10820 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  f.  if( rc ){.  
10830 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
10840 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
10850 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52  nter(-1);.  OSTR
10860 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
10870 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
10880 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f  File->h, rc ? "o
10890 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
108a0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
108b0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
108c0 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
108d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
108e0 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
108f0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
10920 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
10930 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
10940 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
10950 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
10960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
10970 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
10980 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
10990 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
109a0 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
109b0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
109c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
109d0 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
109e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
109f0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
10a00 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
10a10 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
10a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
10a30 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
10a40 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
10a50 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10a70 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
10a80 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
10a90 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
10aa0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
10ab0 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
10ac0 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
10ad0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
10ae0 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  E.  OVERLAPPED o
10af0 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
10b00 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
10b10 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
10b20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
10b30 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
10b40 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
10b50 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
10b60 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10b90 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
10ba0 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
10bb0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
10be0 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
10bf0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
10c00 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
10c10 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
10c20 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
10c30 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
10c40 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29  LITE_IOERR_READ)
10c50 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
10c60 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  AD file=%p, buff
10c70 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
10c80 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c  , offset=%lld, l
10c90 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
10ca0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
10cb0 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
10cc0 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
10cd0 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
10ce0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10cf0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
10d00 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
10d10 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
10d20 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
10d30 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
10d40 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
10d50 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
10d60 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
10d70 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
10d80 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
10d90 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
10da0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
10db0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
10dc0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
10dd0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
10de0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
10df0 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
10e00 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50  RACE(("READ-MMAP
10e10 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
10e20 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
10e30 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
10e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10e60 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
10e70 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
10e80 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
10e90 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
10ea0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
10eb0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
10ec0 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
10ed0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
10ee0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
10ef0 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
10f00 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
10f10 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
10f20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
10f30 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10f40 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  E.  if( winSeekF
10f50 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
10f60 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  t) ){.    OSTRAC
10f70 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
10f80 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
10f90 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
10fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10fb0 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
10fc0 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
10fd0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
10fe0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
10ff0 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
11000 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
11010 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
11020 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
11030 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
11040 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
11050 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
11060 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
11070 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
11080 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
11090 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
110a0 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
110b0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
110c0 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
110d0 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
110e0 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
110f0 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
11100 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
11110 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
11120 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69  rrno;.    if( wi
11130 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
11140 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
11150 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11160 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11170 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
11180 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
11190 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
111a0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c  LITE_IOERR_READ\
111b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
111c0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
111d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
111e0 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d  ERR_READ, pFile-
111f0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
11220 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
11230 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e  .  winLogIoerr(n
11240 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52  Retry);.  if( nR
11250 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
11260 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
11270 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
11280 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
11290 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
112a0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
112b0 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
112c0 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
112d0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
112e0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
112f0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
11300 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  AD\n", pFile->h)
11310 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11320 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
11330 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _READ;.  }..  OS
11340 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
11350 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
11360 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
11370 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11380 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11390 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
113a0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
113b0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
113c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
113d0 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
113e0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
113f0 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
11400 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
11410 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
11420 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
11430 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
11440 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
11450 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
11460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11470 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
11480 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
11490 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
114c0 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
114d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
114e0 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
114f0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
11500 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
11510 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
11520 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11550 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
11560 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
11570 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
11580 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
11590 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
115a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
115b0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
115c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
115d0 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
115e0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
115f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
11600 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
11610 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
11620 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
11630 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  TE);.  SimulateD
11640 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
11650 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
11660 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  ;..  OSTRACE(("W
11670 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75  RITE file=%p, bu
11680 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
11690 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
116a0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
116b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
116c0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
116d0 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
116e0 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
116f0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
11700 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
11710 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
11720 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
11730 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
11740 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
11750 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
11760 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
11770 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
11780 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
11790 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
117a0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
117b0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
117c0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
117d0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
117e0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
117f0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
11800 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
11810 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d  OSTRACE(("WRITE-
11820 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  MMAP file=%p, rc
11830 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
11840 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
11850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11860 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
11870 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
11880 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
11890 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
118a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
118b0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
118c0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
118d0 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
118e0 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
118f0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
11900 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
11910 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
11920 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
11930 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11940 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
11950 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e  WINCE.  rc = win
11960 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
11970 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
11980 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20  c==0 ){.#else.  
11990 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  {.#endif.#if !SQ
119a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
119b0 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
119c0 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
119d0 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
119e0 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a  r WriteFile. */.
119f0 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61  #endif.    u8 *a
11a00 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66  Rem = (u8 *)pBuf
11a10 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
11a20 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
11a30 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  en */.    int nR
11a40 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
11a50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11a60 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74  r of bytes yet t
11a70 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
11a80 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
11a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11aa0 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74    /* Bytes writt
11ab0 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65  en by each Write
11ac0 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20  File() call */. 
11ad0 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
11ae0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20  no = NO_ERROR;  
11af0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
11b00 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
11b10 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51  or() */..#if !SQ
11b20 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11b30 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
11b40 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
11b50 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
11b60 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
11b70 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
11b80 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
11b90 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
11ba0 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
11bb0 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
11bc0 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
11bd0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68  ;.#endif..    wh
11be0 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23  ile( nRem>0 ){.#
11bf0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11c00 43 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  CE.      if( !os
11c10 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
11c20 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
11c30 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23  &nWrite, 0) ){.#
11c40 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21  else.      if( !
11c50 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
11c60 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
11c70 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72  , &nWrite, &over
11c80 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69  lapped) ){.#endi
11c90 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  f.        if( wi
11ca0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
11cb0 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
11cc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11cd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ce0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
11cf0 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
11d00 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52  Write<=(DWORD)nR
11d10 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  em );.      if( 
11d20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
11d30 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20  ite>(DWORD)nRem 
11d40 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
11d50 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11d60 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
11d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11d80 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
11d90 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65  INCE.      offse
11da0 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
11db0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
11dc0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
11dd0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
11de0 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  f);.      overla
11df0 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
11e00 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
11e10 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
11e20 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ff);.#endif.    
11e30 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
11e40 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
11e50 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
11e60 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
11e70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11e80 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
11e90 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
11ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
11eb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
11ec0 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
11ed0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
11ee0 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
11ef0 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
11f00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
11f10 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
11f20 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
11f30 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
11f40 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
11f50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
11f70 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11f80 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  FULL, pFile->las
11f90 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46   "winWrite1", pF
11fc0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
11fd0 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28   }.    OSTRACE((
11fe0 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20  "WRITE file=%p, 
11ff0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
12000 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d  WRITE\n", pFile-
12010 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
12020 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
12030 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c  ITE_IOERR_WRITE,
12040 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12050 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12060 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72            "winWr
12070 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ite2", pFile->zP
12080 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
12090 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e     winLogIoerr(n
120a0 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53  Retry);.  }.  OS
120b0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69  TRACE(("WRITE fi
120c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
120d0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
120e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
120f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12100 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
12110 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
12120 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
12130 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e  atic int winTrun
12140 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
12150 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
12160 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77  nt64 nByte){.  w
12170 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
12180 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
12190 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62  * File handle ob
121a0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
121b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
121c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
121d0 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69  urn code for thi
121e0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
121f0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
12200 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
12210 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
12220 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
12230 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
12240 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ATE);.  OSTRACE(
12250 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d  ("TRUNCATE file=
12260 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c  %p, size=%lld, l
12270 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
12280 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
12290 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  nByte, pFile->lo
122a0 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
122b0 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
122c0 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
122d0 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
122e0 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
122f0 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
12300 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
12310 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
12320 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
12330 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
12340 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
12350 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
12360 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
12370 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
12380 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
12390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
123a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
123b0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
123c0 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
123d0 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
123e0 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
123f0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
12400 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
12410 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
12420 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
12430 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
12440 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
12450 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  /.  if( winSeekF
12460 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
12470 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
12480 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12490 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
124a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
124b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
124c0 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
124d0 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
124e0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
124f0 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
12500 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26  File(pFile->h) &
12510 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  &.            ((
12520 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12530 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
12540 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44  RROR_USER_MAPPED
12550 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46  _FILE) ){.    pF
12560 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12570 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
12580 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
12590 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
125a0 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
125b0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
125d0 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
125e0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
125f0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
12600 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
12610 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
12620 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
12630 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
12640 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
12650 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65  y.  ** mapped re
12660 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
12670 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
12680 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
12690 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a   SQLite will.  *
126a0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
126b0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
126c0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
126d0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
126e0 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ow on..  */.  if
126f0 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
12700 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69  ion && nByte<pFi
12710 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
12720 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
12730 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ize = nByte;.  }
12740 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
12750 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69  CE(("TRUNCATE fi
12760 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
12770 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
12780 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
12790 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
127a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
127b0 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
127c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
127d0 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
127e0 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
127f0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
12800 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
12810 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
12820 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
12830 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
12840 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
12850 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
12860 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
12870 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
12880 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
12890 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
128a0 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
128b0 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
128c0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
128d0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
128e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
128f0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
12900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
12910 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _SYNC.  /*.  ** 
12920 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53  Used only when S
12930 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
12940 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20   not defined..  
12950 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23   */.  BOOL rc;.#
12960 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
12970 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
12980 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
12990 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20  _SYNC) || \.    
129a0 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
129b0 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
129c0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a  (SQLITE_DEBUG)).
129d0 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77    /*.  ** Used w
129e0 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
129f0 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
12a00 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73  d and by the ass
12a10 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a  ert() and/or.  *
12a20 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72  * OSTRACE() macr
12a30 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46  os..   */.  winF
12a40 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
12a50 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65  nFile*)id;.#else
12a60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12a70 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a  TER(id);.#endif.
12a80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12a90 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   );.  /* Check t
12aa0 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
12ab0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
12ac0 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
12ad0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
12ae0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
12af0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
12b00 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
12b10 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
12b20 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
12b30 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
12b40 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
12b50 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
12b60 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
12b70 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
12b80 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
12b90 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
12ba0 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
12bb0 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
12bc0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
12bd0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12be0 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54  E_FULL );..  OST
12bf0 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65  RACE(("SYNC file
12c00 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c  =%p, flags=%x, l
12c10 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
12c20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
12c30 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f  flags, pFile->lo
12c40 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64  cktype));..#ifnd
12c50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
12c60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12c70 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a  R(flags);.#else.
12c80 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30    if( (flags&0x0
12c90 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
12ca0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
12cb0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
12cc0 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
12cd0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
12ce0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
12cf0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
12d00 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
12d10 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
12d20 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
12d30 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
12d40 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
12d50 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22  YNC.  OSTRACE(("
12d60 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70  SYNC-NOP file=%p
12d70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12d80 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12da0 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  K;.#else.  rc = 
12db0 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
12dc0 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
12dd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12de0 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
12df0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54  f( rc ){.    OST
12e00 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65  RACE(("SYNC file
12e10 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
12e20 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12e30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12e40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
12e50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
12e60 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
12e70 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53  tError();.    OS
12e80 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
12e90 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12ea0 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20  IOERR_FSYNC\n", 
12eb0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12ec0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
12ed0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12ee0 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSYNC, pFile->la
12ef0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65  "winSync", pFile
12f20 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
12f30 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
12f40 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
12f50 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
12f60 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
12f70 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
12f80 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
12f90 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
12fa0 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
12fb0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12fc0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
12fd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12fe0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
12ff0 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
13000 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a  rt( pSize!=0 );.
13010 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13020 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
13030 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20  IOERR_FSTAT);.  
13040 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
13050 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
13060 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
13070 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  Size));..#if SQL
13080 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
13090 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
130a0 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
130b0 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
130c0 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
130d0 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
130e0 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
130f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
13120 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
13130 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
13140 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
13150 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
13160 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
13170 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13180 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
13190 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
131a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
131b0 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
131c0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
131f0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13200 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
13210 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
13220 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
13230 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
13240 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13250 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
13260 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
13270 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
13280 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
13290 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
132a0 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
132b0 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
132c0 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
132d0 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
132e0 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
132f0 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
13300 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13310 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
13320 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
13330 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
13340 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
13350 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
13360 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
13370 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
13380 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
133a0 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
133b0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
133c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
133d0 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
133e0 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20  e=%p, pSize=%p, 
133f0 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d  *pSize=%lld, rc=
13400 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
13410 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a    pFile->h, pSiz
13420 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74  e, *pSize, sqlit
13430 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
13440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13450 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
13460 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
13470 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
13480 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
13490 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
134a0 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
134b0 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
134c0 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
134d0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
134e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
134f0 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
13500 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IVE_LOCK.# defin
13510 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  e LOCKFILE_EXCLU
13520 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64  SIVE_LOCK 2.#end
13530 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72  if../*.** Histor
13540 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68  ically, SQLite h
13550 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65  as used both the
13560 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f   LockFile and Lo
13570 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
13580 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ns..** When the 
13590 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f  LockFile functio
135a0 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77  n was used, it w
135b0 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  as always expect
135c0 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d  ed to fail.** im
135d0 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
135e0 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
135f0 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c  be obtained.  Al
13600 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78  so, it always ex
13610 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74  pected to.** obt
13620 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
13630 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c   lock.  These fl
13640 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ags are used wit
13650 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  h the LockFileEx
13660 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64   function.** and
13670 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65   reflect those e
13680 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65  xpectations; the
13690 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f  refore, they sho
136a0 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  uld not be chang
136b0 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
136c0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
136d0 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
136e0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
136f0 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f  AGS   (LOCKFILE_
13700 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
13710 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   | \.           
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f         LOCKFILE_
13740 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
13750 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75  #endif../*.** Cu
13760 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20  rrently, SQLite 
13770 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20  never calls the 
13780 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
13790 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74  ion without want
137a0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20  ing the.** call 
137b0 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74  to fail immediat
137c0 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
137d0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
137e0 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
137f0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
13800 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
13810 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
13820 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c  X_FLAGS (LOCKFIL
13830 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
13840 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  LY).#endif../*.*
13850 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
13860 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66  er lock..** Diff
13870 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e  erent API routin
13880 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65  es are called de
13890 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
138a0 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a  er or not this.*
138b0 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69  * is Win9x or Wi
138c0 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nNT..*/.static i
138d0 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  nt winGetReadLoc
138e0 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
138f0 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
13900 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
13910 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
13920 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
13930 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
13940 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73  pe));.  if( osIs
13950 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
13960 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
13970 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
13980 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
13990 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
139a0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
139b0 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
139c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50  .    **       AP
139d0 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20  I LockFileEx..  
139e0 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77    */.    res = w
139f0 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46  inceLockFile(&pF
13a00 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
13a10 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  IRST, 0, 1, 0);.
13a20 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20  #else.    res = 
13a30 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
13a40 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
13a50 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20  CKFILEEX_FLAGS, 
13a60 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
13a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a80 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
13a90 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  ZE, 0);.#endif. 
13aa0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13ab0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
13ac0 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
13ad0 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
13ae0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
13af0 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
13b00 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
13b10 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
13b20 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
13b30 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
13b40 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
13b50 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
13b60 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
13b70 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
13ba0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
13bb0 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
13bc0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
13bd0 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
13be0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13bf0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
13c00 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
13c10 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
13c20 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
13c30 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43   */.  }.  OSTRAC
13c40 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69  E(("READ-LOCK fi
13c50 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
13c60 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
13c70 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
13c80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
13c90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
13ca0 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
13cb0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
13cc0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
13cd0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
13ce0 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
13cf0 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
13d00 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
13d10 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
13d20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
13d30 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
13d40 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
13d50 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
13d60 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
13d70 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
13d80 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
13d90 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
13da0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
13db0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
13dc0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
13dd0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
13de0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
13df0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
13e00 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
13e10 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
13e20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
13e30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13e40 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
13e50 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
13e60 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
13e70 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
13e80 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
13e90 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
13ea0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
13eb0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
13ed0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
13ee0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13ef0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13f00 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
13f10 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
13f20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
13f30 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b  3ErrName(res)));
13f40 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
13f50 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
13f60 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
13f70 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
13f80 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
13f90 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
13fa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
13fb0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
13fc0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
13fd0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
13fe0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
13ff0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
14000 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
14010 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
14020 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
14030 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
14040 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
14050 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
14060 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
14070 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
14080 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
14090 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
140a0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
140b0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
140c0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
140d0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
140e0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
140f0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
14100 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
14110 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
14120 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
14130 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
14140 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
14150 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
14160 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
14170 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
14180 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14190 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
141a0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
141b0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
141c0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
141d0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
141e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
141f0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
14200 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
14210 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
14220 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
14230 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b  .  The winUnlock
14240 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
14250 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
14260 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
14270 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
14280 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
14290 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
142a0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
142b0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
142c0 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
142d0 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
142e0 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
142f0 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
14300 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  evel 0..*/.stati
14310 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71  c int winLock(sq
14320 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14330 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
14340 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14350 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
14360 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
14370 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
14380 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
14390 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
143a0 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a Windows lock 
143b0 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
143c0 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
143d0 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c   /* Set pFile->l
143e0 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20  ocktype to this 
143f0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69  value before exi
14400 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f  ting */.  int go
14410 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
14420 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61  ;/* True if we a
14430 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e  cquired a PENDIN
14440 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65  G lock this time
14450 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
14460 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
14470 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
14480 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
14490 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  R;..  assert( id
144a0 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
144b0 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
144c0 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
144d0 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
144e0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
144f0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
14500 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
14510 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
14520 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  ktype));..  /* I
14530 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
14540 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
14550 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
14560 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
14570 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
14580 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
14590 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
145a0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
145b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
145c0 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
145d0 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
145e0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
145f0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
14600 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
14610 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48  OSTRACE(("LOCK-H
14620 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ELD file=%p, rc=
14630 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
14640 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14660 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
14670 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
14680 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
14690 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
146a0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
146b0 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
146c0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
146d0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
146e0 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
146f0 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
14700 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
14710 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
14720 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14730 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
14740 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
14750 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
14760 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
14770 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
14780 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
14790 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
147a0 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
147b0 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
147c0 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
147d0 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
147e0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
147f0 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
14800 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
14810 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
14820 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69  pe;.  if(   (pFi
14830 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
14840 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28  _LOCK).     || (
14850 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58     (locktype==EX
14860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
14870 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65         && (pFile
14880 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
14890 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  RVED_LOCK)).  ){
148a0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33  .    int cnt = 3
148b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
148c0 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77  -->0 && (res = w
148d0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
148e0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
148f0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
14930 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30  TE, 0, 1, 0))==0
14940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
14950 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20   3 times to get 
14960 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  the pending lock
14970 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  .  This is neede
14980 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20  d to work.      
14990 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ** around proble
149a0 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64  ms caused by ind
149b0 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74  exing and/or ant
149c0 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  i-virus software
149d0 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e   on.      ** Win
149e0 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20  dows systems..  
149f0 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72      ** If you ar
14a00 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64  e using this cod
14a10 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72  e as a model for
14a20 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53   alternative VFS
14a30 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20  es, do not.     
14a40 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65   ** copy this re
14a50 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69  try logic.  It i
14a60 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65  s a hack intende
14a70 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e  d for Windows on
14a80 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
14a90 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
14aa0 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66  K-PENDING-FAIL f
14ab0 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64  ile=%p, count=%d
14ac0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
14ad0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14ae0 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65  ->h, cnt, sqlite
14af0 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b  3ErrName(res)));
14b00 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
14b10 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
14b20 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
14b30 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
14b40 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
14b50 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c   !res ){.      l
14b60 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14b70 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14b80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
14b90 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f  uire a shared lo
14ba0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
14bb0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
14bc0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
14bd0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14be0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
14bf0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
14c00 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
14c10 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
14c20 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
14c30 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
14c40 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
14c50 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
14c60 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14c70 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
14c80 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
14c90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
14ca0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
14cb0 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
14cc0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
14cd0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
14ce0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
14cf0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
14d00 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
14d10 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
14d20 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
14d30 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
14d40 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
14d50 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
14d60 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
14d70 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  VED_LOCK;.    }e
14d80 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
14d90 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14da0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
14db0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
14dc0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
14dd0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
14de0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
14df0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
14e00 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
14e10 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
14e20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
14e30 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
14e40 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
14e50 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
14e60 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
14e70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
14e80 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
14e90 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
14ea0 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
14eb0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
14ec0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
14ed0 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20  pFile);.    res 
14ee0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
14ef0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
14f00 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
14f10 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
14f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14f30 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
14f40 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
14f50 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
14f60 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
14f70 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
14f80 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
14f90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
14fa0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
14fb0 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
14fc0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
14fd0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
14fe0 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
14ff0 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
15000 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
15010 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
15020 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
15030 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
15040 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
15050 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
15060 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
15070 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
15080 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
15090 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
150a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
150b0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
150c0 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
150d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
150e0 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
150f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
15100 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
15110 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
15120 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15130 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
15140 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15150 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
15160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15170 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  SY;.    OSTRACE(
15180 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
15190 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20  =%p, wanted=%d, 
151a0 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  got=%d\n",.     
151b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
151c0 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c  , locktype, newL
151d0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20  ocktype));.  }. 
151e0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
151f0 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
15200 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
15210 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
15220 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
15230 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15240 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
15250 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
15260 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
15270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15280 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15290 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
152a0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
152b0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
152c0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
152d0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
152e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
152f0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
15300 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
15310 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
15320 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
15330 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
15340 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
15350 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
15360 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
15370 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69   int rc;.  winFi
15380 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
15390 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
153a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
153b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
153c0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
153d0 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  OCK; );.  OSTRAC
153e0 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
153f0 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
15400 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%p\n", pFile->
15410 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  h, pResOut));.. 
15420 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
15430 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
15440 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
15450 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
15460 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
15470 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
15480 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20   file=%p, rc=%d 
15490 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c  (local)\n", pFil
154a0 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65  e->h, rc));.  }e
154b0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  lse{.    rc = wi
154c0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
154d0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
154e0 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53  FILEEX_FLAGS,RES
154f0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
15500 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15510 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
15520 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15530 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
15540 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
15550 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a  }.    rc = !rc;.
15560 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
15570 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
15580 25 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74  %p, rc=%d (remot
15590 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
155a0 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52   rc));.  }.  *pR
155b0 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53  esOut = rc;.  OS
155c0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
155d0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52  LOCK file=%p, pR
155e0 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
155f0 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
15600 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
15610 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65     pFile->h, pRe
15620 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
15630 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15640 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
15650 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
15660 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
15670 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
15680 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
15690 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
156a0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
156b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
156c0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
156d0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
156e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
156f0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15700 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15710 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15720 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15730 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15740 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
15750 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
15760 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
15770 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
15780 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
15790 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
157a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
157b0 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
157c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
157d0 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
157e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
157f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15800 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
15810 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
15820 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
15830 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
15840 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
15850 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
15860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
15870 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
15880 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
15890 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
158a0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
158b0 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
158c0 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20  oldLock=%d(%d), 
158d0 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  newLock=%d\n",. 
158e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
158f0 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
15900 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
15910 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b  edLockByte, lock
15920 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d  type));.  type =
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 74 79 70 65 3e 3d 45 58  ;.  if( type>=EX
15950 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
15960 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
15970 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
15980 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
15990 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
159a0 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
159b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
159c0 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28  !winGetReadLock(
159d0 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
159e0 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
159f0 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
15a00 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
15a10 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
15a20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
15a30 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
15a40 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
15a50 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
15a60 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c  R_UNLOCK, osGetL
15a70 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a90 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
15aa0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15ab0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
15ac0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
15ad0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
15ae0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15af0 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
15b00 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
15b10 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
15b20 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
15b30 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
15b40 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61      winUnlockRea
15b50 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
15b60 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
15b70 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
15b80 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
15b90 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
15ba0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
15bb0 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
15bc0 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
15bd0 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
15be0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
15bf0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
15c00 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
15c10 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
15c20 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
15c30 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
15c40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
15c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
15c60 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
15c70 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
15c80 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
15c90 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
15ca0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
15cb0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
15cc0 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
15cd0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
15ce0 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
15cf0 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
15d00 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
15d10 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
15d20 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
15d30 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
15d40 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
15d50 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
15d60 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
15d70 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
15d80 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
15d90 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
15da0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
15db0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
15dc0 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
15dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
15de0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
15df0 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
15e00 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
15e10 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
15e20 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
15e30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53  eferences to VFS
15e40 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20   helper methods 
15e50 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  used for tempora
15e60 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ry files */.stat
15e70 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
15e80 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
15e90 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73  s *, char **);.s
15ea0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
15eb0 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  ir(const void *)
15ec0 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  ;.static BOOL wi
15ed0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
15ee0 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  dColon(const cha
15ef0 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  r *);../*.** Con
15f00 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
15f10 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
15f20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
15f30 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
15f40 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
15f50 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
15f60 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
15f70 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
15f80 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
15f90 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
15fa0 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70  ile=%p, op=%d, p
15fb0 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Arg=%p\n", pFile
15fc0 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b  ->h, op, pArg));
15fd0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
15fe0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15ff0 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
16000 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
16010 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
16020 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f  ocktype;.      O
16030 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
16040 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16050 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
16060 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
16070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
16080 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
16090 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
160a0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
160b0 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
160c0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
160d0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
160e0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
160f0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
16100 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
16110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16120 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
16130 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
16140 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
16150 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
16160 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
16170 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
16180 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
16190 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
161a0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
161b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
161c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
161d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
161e0 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
161f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
16200 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
16210 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
16220 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
16230 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
16240 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
16250 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16280 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
16290 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
162a0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
162b0 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
162c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
162d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
162e0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
162f0 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
16300 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
16310 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
16320 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16330 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
16340 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16350 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
16360 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
16370 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
16380 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16390 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
163a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
163b0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
163c0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
163d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
163e0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
163f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16400 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
16410 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
16420 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
16430 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
16440 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
16450 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
16460 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
16470 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
16480 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
16490 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
164a0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
164b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
164c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
164d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
164e0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
164f0 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
16500 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
16510 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
16520 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
16530 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
16540 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
16550 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
16560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
16570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
16580 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16590 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
165a0 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
165b0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
165c0 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b  printf("win32");
165d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
165e0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
165f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16600 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16620 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
16630 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
16640 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
16650 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
16660 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
16670 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
16680 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65  {.        winIoe
16690 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a  rrRetry = a[0];.
166a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
166b0 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49       a[0] = winI
166c0 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
166d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
166e0 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
166f0 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
16700 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
16710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
16720 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [1] = winIoerrRe
16730 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20  tryDelay;.      
16740 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
16750 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
16760 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
16770 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
16780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16790 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
167a0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
167b0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
167c0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
167d0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  File = 0;.      
167e0 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54  int rc = winGetT
167f0 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
16800 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20  Vfs, &zTFile);. 
16810 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16820 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16830 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
16840 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
16850 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
16860 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
16870 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
16880 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
16890 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
168a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
168b0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
168c0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
168d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
168e0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
168f0 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
16900 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
16910 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
16920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16930 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
16940 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16950 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
16960 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
16970 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16980 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
16990 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
169a0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
169b0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
169c0 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
169d0 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
169e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
169f0 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
16a00 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
16a10 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
16a20 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
16a30 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
16a40 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
16a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76   ){.          (v
16a60 6f 69 64 29 77 69 6e 55 6e 6d 61 70 66 69 6c 65  oid)winUnmapfile
16a70 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
16a80 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69     rc = winMapfi
16a90 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
16aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16ab0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16ac0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16ad0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
16ae0 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
16af0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
16b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16b10 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53  .#endif.  }.  OS
16b20 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
16b30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
16b40 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46  _NOTFOUND\n", pF
16b50 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
16b70 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
16b80 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
16b90 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
16ba0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
16bb0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
16bc0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
16bd0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
16be0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
16bf0 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
16c00 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
16c10 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
16c20 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
16c30 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
16c40 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
16c50 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
16c60 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
16c70 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
16c80 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
16c90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
16ca0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
16cb0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
16cc0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
16cd0 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
16ce0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
16cf0 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
16d00 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
16d10 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
16d20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16d30 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20  ){.  (void)id;. 
16d40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
16d50 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
16d60 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
16d70 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
16d80 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
16d90 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
16da0 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
16db0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
16dc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
16dd0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d  {.  winFile *p =
16de0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
16df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16e00 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
16e10 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
16e20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46        ((p->ctrlF
16e30 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50  lags & WINFILE_P
16e40 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41  SOW)?SQLITE_IOCA
16e50 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
16e60 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20  WRITE:0);.}../* 
16e70 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
16e80 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
16e90 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
16ea0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
16eb0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
16ec0 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
16ed0 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
16ee0 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
16ef0 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
16f00 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
16f10 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
16f20 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53  ity size..*/.SYS
16f30 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49  TEM_INFO winSysI
16f40 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nfo;..#ifndef SQ
16f50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
16f60 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
16f70 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
16f80 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
16f90 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
16fa0 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
16fb0 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
16fc0 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
16fd0 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
16fe0 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73  used by .** this
16ff0 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
17000 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
17010 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
17020 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
17030 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
17040 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
17050 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
17060 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
17070 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
17080 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
17090 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
170a0 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
170b0 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
170c0 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
170d0 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
170e0 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
170f0 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
17100 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
17110 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
17120 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
17130 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
17140 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
17150 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17160 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
17170 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
17180 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
17190 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
171a0 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
171b0 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
171c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
171d0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
171e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
171f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
17200 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
17210 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
17220 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  t winShmMutexHel
17230 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
17240 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
17250 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
17260 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
17270 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
17280 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
17290 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
172a0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
172b0 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
172c0 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
172d0 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
172e0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
172f0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
17300 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
17310 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
17320 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
17330 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
17340 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
17350 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
17360 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
17370 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
17380 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
17390 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
173a0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
173b0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
173c0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
173d0 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
173e0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
173f0 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
17400 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
17410 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
17420 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
17430 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
17440 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
17450 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
17460 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
17470 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ext .**.** The f
17480 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
17490 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
174a0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
174b0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
174c0 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
174d0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
174e0 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
174f0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
17500 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
17510 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
17520 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
17530 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
17540 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
17550 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
17560 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
17570 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
17580 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
17590 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
175a0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
175b0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
175c0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
175d0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
175e0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
175f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
17600 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
17610 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
17620 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
17630 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
17640 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
17650 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
17660 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
17670 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
17680 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
17690 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
176a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
176b0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
176c0 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
176d0 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
176e0 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
176f0 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
17700 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
17710 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
17720 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
17730 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
17740 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
17750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
17760 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
17770 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
17780 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
17790 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
177a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
177b0 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
177c0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
177d0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
177e0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
177f0 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
17800 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
17810 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
17820 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
17830 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
17840 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
17850 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
17860 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  cts */.#ifdef SQ
17870 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
17880 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
17890 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
178a0 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
178b0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
178c0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
178d0 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
178e0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
178f0 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
17900 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
17910 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
17920 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
17930 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
17940 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
17950 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
17960 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
17970 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
17980 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
17990 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
179a0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
179b0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
179c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
179d0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
179e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
179f0 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
17a00 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
17a10 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
17a20 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
17a30 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
17a40 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
17a50 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
17a60 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
17a70 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
17a80 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
17a90 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
17aa0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
17ab0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
17ac0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
17ad0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
17ae0 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
17af0 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
17b00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
17b10 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
17b20 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
17b30 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
17b40 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
17b50 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
17b60 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
17b70 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
17b80 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ba0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
17bb0 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
17bc0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
17bd0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
17be0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
17bf0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
17c00 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
17c10 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
17c20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
17c30 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
17c40 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
17c50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
17c60 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
17c70 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
17c80 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
17c90 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d   with its winShm
17ca0 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  Node */.#endif.}
17cb0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
17cc0 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
17cd0 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing.*/.#define W
17ce0 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IN_SHM_BASE   ((
17cf0 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
17d00 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f  OCK)*4)        /
17d10 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
17d20 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
17d30 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e  _SHM_DMS    (WIN
17d40 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
17d50 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
17d60 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
17d70 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  /../*.** Apply a
17d80 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
17d90 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65  r all n bytes be
17da0 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e  ginning at ofst.
17db0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d  .*/.#define _SHM
17dc0 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
17dd0 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  e _SHM_RDLCK  2.
17de0 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c  #define _SHM_WRL
17df0 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74  CK  3.static int
17e00 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
17e10 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  k(.  winShmNode 
17e20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70  *pFile,    /* Ap
17e30 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
17e40 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
17e50 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
17e60 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
17e70 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f          /* _SHM_
17e80 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43  UNLCK, _SHM_RDLC
17e90 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b  K, or _SHM_WRLCK
17ea0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17ec0 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
17ed0 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
17ee0 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  /unlocked */.  i
17ef0 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
17f00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17f10 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
17f20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
17f30 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
17f40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17f50 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
17f60 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
17f70 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
17f80 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
17f90 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
17fa0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
17fb0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
17fc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17fd0 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
17fe0 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
17ff0 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  f==0 );..  OSTRA
18000 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
18010 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
18020 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d  offset=%d, size=
18030 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
18040 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
18050 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74  , lockType, ofst
18060 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  , nByte));..  /*
18070 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
18080 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
18090 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
180a0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
180b0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
180c0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
180d0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
180e0 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
180f0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
18100 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
18110 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
18120 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
18130 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
18140 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
18150 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
18160 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
18170 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
18180 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
18190 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
181a0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
181b0 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
181c0 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
181d0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
181e0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
181f0 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
18200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
18210 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
18220 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
18230 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
18250 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
18260 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
18270 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20  le=%p, func=%s, 
18280 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73  errno=%lu, rc=%s
18290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
182a0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
182b0 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48  (lockType == _SH
182c0 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55  M_UNLCK) ? "winU
182d0 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20  nlockFile" :.   
182e0 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b          "winLock
182f0 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61  File", pFile->la
18300 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33  stErrno, sqlite3
18310 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a  ErrName(rc)));..
18320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18330 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
18340 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74  ences to VFS met
18350 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  hods */.static i
18360 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74  nt winOpen(sqlit
18370 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68  e3_vfs*,const ch
18380 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  ar*,sqlite3_file
18390 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61  *,int,int*);.sta
183a0 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
183b0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
183c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
183d0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  ;../*.** Purge t
183e0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  he winShmNodeLis
183f0 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
18400 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68  tries with winSh
18410 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
18420 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
18430 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
18440 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
18450 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
18460 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
18470 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
18480 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
18490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
184a0 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33  ShmPurge(sqlite3
184b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
184c0 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77  deleteFlag){.  w
184d0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a  inShmNode **pp;.
184e0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b    winShmNode *p;
184f0 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61  .  BOOL bRc;.  a
18500 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
18510 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53  exHeld() );.  OS
18520 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
18530 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74  E pid=%lu, delet
18540 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20  eFlag=%d\n",.   
18550 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
18560 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
18570 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20   deleteFlag));. 
18580 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
18590 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
185a0 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
185b0 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
185c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
185d0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
185e0 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
185f0 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
18600 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tex);.      for(
18610 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
18620 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
18630 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69   bRc = osUnmapVi
18640 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67  ewOfFile(p->aReg
18650 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20  ion[i].pMap);.  
18660 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18670 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20  SHM-PURGE-UNMAP 
18680 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
18690 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
186b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
186c0 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f  ssId(), i, bRc ?
186d0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
186e0 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  ));.        bRc 
186f0 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
18700 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d  p->aRegion[i].hM
18710 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
18720 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
18730 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  -CLOSE pid=%lu, 
18740 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
18750 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18760 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
18770 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
18780 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
18790 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
187a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
187b0 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26  hFile.h!=NULL &&
187c0 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56   p->hFile.h!=INV
187d0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
187e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  E ){.        Sim
187f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18800 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
18810 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  inClose((sqlite3
18820 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c  _file *)&p->hFil
18830 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  e);.        Simu
18840 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18850 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
18860 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
18870 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  ag ){.        Si
18880 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18890 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
188a0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
188b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
188c0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
188d0 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
188e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
188f0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
18900 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
18910 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18920 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18930 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  }.      *pp = p-
18940 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
18950 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52  lite3_free(p->aR
18960 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  egion);.      sq
18970 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
18980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18990 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a  pp = &p->pNext;.
189a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
189b0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72  ** Open the shar
189c0 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
189d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
189e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62  atabase file pDb
189f0 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  Fd..**.** When o
18a00 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
18a10 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
18a20 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
18a30 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
18a40 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
18a50 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
18a60 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
18a70 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
18a80 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
18a90 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
18aa0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
18ab0 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
18ac0 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
18ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18ae0 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
18af0 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64  y(winFile *pDbFd
18b00 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  ){.  struct winS
18b10 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
18b20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
18b30 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
18b40 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
18b50 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
18b60 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
18b70 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
18b80 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
18b90 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
18bc0 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
18bd0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
18be0 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
18bf0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
18c00 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
18c10 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
18c40 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
18c50 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
18c60 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20  ->pShm==0 );    
18c70 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c  /* Not previousl
18c80 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f  y opened */..  /
18c90 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
18ca0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c   for the new sql
18cb0 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e  ite3_shm object.
18cc0 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69    Also speculati
18cd0 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  vely.  ** alloca
18ce0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  te space for a n
18cf0 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e  ew winShmNode an
18d00 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f  d filename..  */
18d10 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
18d20 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
18d30 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
18d40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18d50 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
18d60 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
18d70 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d  3Strlen30(pDbFd-
18d80 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20  >zPath);.  pNew 
18d90 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
18da0 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68  ero( sizeof(*pSh
18db0 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b  mNode) + nName +
18dc0 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65   17 );.  if( pNe
18dd0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
18de0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
18df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18e00 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
18e10 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
18e20 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
18e30 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
18e40 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
18e50 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
18e60 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
18e70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
18e80 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
18e90 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
18ea0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
18eb0 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20   ..  /* Look to 
18ec0 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
18ed0 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
18ee0 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
18ef0 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
18f00 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
18f10 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
18f20 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
18f30 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
18f40 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
18f50 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
18f60 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
18f70 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
18f80 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
18f90 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
18fa0 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
18fb0 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
18fc0 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
18fd0 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
18fe0 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
18ff0 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
19000 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
19010 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
19020 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
19030 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
19040 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
19050 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
19060 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
19070 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
19080 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19090 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
190a0 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
190b0 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
190c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
190d0 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
190e0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
190f0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
19100 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
19110 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
19120 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
19130 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
19140 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
19150 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
19160 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
19170 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
19180 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
19190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
191a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
191b0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
191c0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
191d0 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70    rc = winOpen(p
191e0 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20  DbFd->pVfs,.    
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
19200 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
19210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19220 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
19230 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20  e (UTF-8) */.   
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
19250 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53  qlite3_file*)&pS
19260 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20  hmNode->hFile,  
19270 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68  /* File handle h
19280 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ere */.         
19290 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
192a0 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45  PEN_WAL | SQLITE
192b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
192c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
192d0 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  EATE,.          
192e0 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
192f0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
19300 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
19310 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
19320 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
19330 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
19340 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
19350 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
19360 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
19370 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
19380 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
19390 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
193a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
193b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
193c0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
193d0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
193e0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
193f0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
19400 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
19410 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
19420 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
19430 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19450 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
19460 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
19470 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
19480 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
194b0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
194c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
194d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
194e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
194f0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
19500 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
19510 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
19520 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
19530 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
19540 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
19550 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
19560 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
19570 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
19580 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
19590 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
195a0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
195b0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
195c0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
195d0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
195e0 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
195f0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
19600 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
19610 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
19620 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
19630 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
19640 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
19650 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
19660 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
19670 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
19680 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
19690 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
196a0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
196b0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
196c0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
196d0 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
196e0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
196f0 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
19700 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
19710 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
19720 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
19730 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
19740 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
19750 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
19760 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
19770 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
19780 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
19790 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
197a0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
197b0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
197c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
197d0 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
197e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
197f0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
19800 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
19810 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
19820 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
19830 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
19840 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19850 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
19860 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
19870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
19880 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
19890 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
198a0 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
198b0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
198c0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
198d0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
198e0 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
198f0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
19900 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
19910 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
19920 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
19930 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
19940 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
19950 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
19960 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
19970 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
19980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
19990 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
199a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
199b0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
199c0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
199d0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
199e0 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
199f0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
19a00 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
19a10 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
19a20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
19a30 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
19a40 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
19a50 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
19a60 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
19a70 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
19a80 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
19a90 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
19aa0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
19ab0 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
19ac0 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
19ad0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
19ae0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
19af0 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
19b00 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
19b10 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
19b20 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
19b30 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
19b40 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
19b50 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
19b60 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
19b70 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
19b80 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
19b90 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
19ba0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
19bb0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
19bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19bd0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
19be0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
19bf0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
19c00 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
19c10 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
19c20 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
19c30 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
19c40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
19c50 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
19c60 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
19c70 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
19c80 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
19c90 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
19ca0 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
19cb0 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
19cc0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
19cd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
19ce0 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
19cf0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
19d00 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19d10 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19d20 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
19d30 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
19d40 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
19d50 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
19d60 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
19d70 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
19d80 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
19d90 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
19da0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
19db0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
19dc0 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
19dd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
19de0 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
19df0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
19e00 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
19e10 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
19e20 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
19e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19e40 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
19e50 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
19e60 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
19e70 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
19e80 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
19e90 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
19ea0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
19eb0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
19ec0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
19ed0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
19ee0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f00 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
19f10 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
19f20 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
19f50 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
19f60 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
19f70 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
19f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
19f90 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
19fa0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
19fb0 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
19fc0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
19fd0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
19fe0 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
19ff0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
1a000 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1a010 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1a020 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1a030 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
1a040 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
1a050 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1a080 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
1a090 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1a0a0 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
1a0b0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1a0c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1a0f0 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1a120 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
1a130 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
1a140 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
1a150 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1a160 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1a170 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1a180 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1a190 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1a1a0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1a1b0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1a1c0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1a1d0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1a1e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1a1f0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1a200 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1a210 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1a220 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1a230 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1a240 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1a250 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1a260 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1a270 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1a280 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1a290 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1a2a0 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1a2b0 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1a2c0 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1a2d0 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1a2e0 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1a2f0 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1a300 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1a310 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1a320 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1a330 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1a340 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1a350 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1a360 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a370 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1a380 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1a390 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1a3a0 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1a3b0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1a3c0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1a3d0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1a3e0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1a3f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a400 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1a410 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1a420 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1a430 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1a440 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1a450 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1a460 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1a470 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1a480 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1a490 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1a4a0 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1a4b0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1a4c0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1a4d0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1a4e0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1a4f0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1a500 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a510 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1a520 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1a530 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1a540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1a560 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1a570 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1a580 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1a590 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
1a5a0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1a5b0 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
1a5c0 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
1a5d0 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
1a5e0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a5f0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1a600 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1a610 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
1a620 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
1a630 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
1a640 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
1a650 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
1a660 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1a670 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1a680 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a690 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1a6a0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
1a6b0 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1a6c0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1a6d0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1a6e0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1a6f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1a700 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1a710 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1a720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1a730 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1a740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a750 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
1a760 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1a770 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
1a780 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1a790 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1a7a0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1a7b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a7c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a7d0 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
1a7e0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1a7f0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1a800 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1a810 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1a820 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1a830 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
1a840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1a850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1a860 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1a870 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
1a880 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1a890 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a8b0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
1a8c0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
1a8d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
1a8e0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
1a8f0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
1a900 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
1a910 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
1a920 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
1a930 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
1a940 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
1a950 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
1a960 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1a970 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1a980 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1a990 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1a9a0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1a9b0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
1a9c0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1a9d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1a9e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1a9f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1aa00 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
1aa10 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
1aa20 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
1aa30 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
1aa40 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
1aa50 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
1aa60 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
1aa70 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
1aa80 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
1aa90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1aaa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aab0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1aac0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1aad0 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
1aae0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1aaf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ab00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ab10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1ab20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1ab30 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
1ab40 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1ab50 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
1ab60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ab70 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1ab80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1ab90 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1aba0 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
1abb0 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
1abc0 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
1abd0 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
1abe0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1abf0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ac00 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
1ac10 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
1ac20 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
1ac30 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
1ac40 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
1ac50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1ac60 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
1ac70 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
1ac80 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
1ac90 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
1aca0 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
1acb0 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
1acc0 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
1acd0 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
1ace0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
1acf0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
1ad00 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
1ad10 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
1ad20 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
1ad30 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
1ad40 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
1ad50 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1ad60 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1ad70 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1ad80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1ad90 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
1ada0 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
1adb0 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
1adc0 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
1add0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1ade0 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
1adf0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1ae00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ae10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ae20 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
1ae30 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
1ae40 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
1ae50 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1ae60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ae70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ae80 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1ae90 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
1aea0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1aeb0 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1aec0 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1aed0 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1aee0 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
1aef0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1af00 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1af10 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1af20 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1af30 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1af40 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1af50 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1af60 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1af70 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1af80 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1af90 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1afa0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1afb0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1afc0 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1afd0 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1afe0 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1aff0 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1b000 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1b010 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1b020 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
1b030 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1b040 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
1b050 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
1b060 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
1b070 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
1b080 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
1b090 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
1b0a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1b0b0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
1b0c0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
1b0d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
1b0e0 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
1b0f0 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
1b100 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
1b110 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
1b120 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
1b130 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1b140 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
1b150 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1b160 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1b170 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1b180 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
1b190 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
1b1a0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1b1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b1c0 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
1b1d0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
1b1f0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
1b200 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1b210 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b230 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
1b240 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
1b250 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
1b260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b270 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
1b280 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
1b2b0 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
1b2c0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
1b2d0 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2f0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
1b300 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
1b310 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1b320 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
1b330 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1b340 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
1b350 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
1b360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b370 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
1b380 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1b390 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1b3a0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1b3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b3c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
1b3d0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
1b3e0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1b3f0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1b400 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b410 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1b420 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1b430 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1b440 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1b450 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1b460 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1b470 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1b480 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1b490 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1b4a0 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1b4b0 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1b4c0 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1b4d0 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1b4e0 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1b4f0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1b500 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1b510 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1b520 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1b530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1b540 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1b550 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1b560 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1b570 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1b580 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1b590 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1b5a0 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1b5b0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1b5c0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1b5d0 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1b5e0 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1b5f0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1b600 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1b610 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1b620 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1b630 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1b640 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1b650 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1b660 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1b670 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1b680 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1b690 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1b6a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b6b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1b6c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1b6d0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1b6e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1b710 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1b720 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1b730 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1b740 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1b750 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1b760 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1b770 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1b780 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1b790 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1b7a0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1b7b0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1b7c0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1b7d0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1b7e0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1b7f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1b800 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1b810 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1b820 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1b830 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1b840 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1b850 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1b860 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1b870 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1b880 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1b890 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1b8a0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1b8b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1b8c0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1b8d0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1b8e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b8f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1b910 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1b920 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1b930 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1b950 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1b960 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1b970 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1b980 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1b990 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1b9a0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1b9b0 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1b9c0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1b9d0 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1b9e0 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1b9f0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1ba00 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1ba10 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1ba20 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1ba30 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1ba40 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1ba50 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1ba60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ba70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1ba80 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
1ba90 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
1baa0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1bab0 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20  gion = apNew;.. 
1bac0 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f     while( pShmNo
1bad0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1bae0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41  gion ){.      HA
1baf0 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c  NDLE hMap = NULL
1bb00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c  ;         /* fil
1bb10 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65  e-mapping handle
1bb20 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   */.      void *
1bb30 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  pMap = 0;       
1bb40 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20        /* Mapped 
1bb50 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f  memory region */
1bb60 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54  .     .#if SQLIT
1bb70 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1bb80 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1bb90 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1bba0 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  pp(pShmNode->hFi
1bbb0 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1bbc0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1bbd0 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  RITE, nByte, NUL
1bbe0 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1bbf0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bc00 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1bc10 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
1bc20 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1bc30 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  W(pShmNode->hFil
1bc40 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
1bc50 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1bc60 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1bc70 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1bc80 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1bc90 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1bca0 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  I).      hMap = 
1bcb0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1bcc0 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
1bcd0 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20  File.h, .       
1bce0 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1bcf0 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1bd00 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1bd10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1bd20 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
1bd30 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
1bd40 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d  region=%d, size=
1bd50 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1bd70 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1bd80 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
1bd90 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1bdb0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
1bdc0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
1bdd0 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
1bde0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1bdf0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1be00 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1be10 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1be20 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1be30 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1be40 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1be50 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
1be60 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1be70 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1be80 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1be90 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1bea0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1beb0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1bec0 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66    iOffset - iOff
1bed0 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1bee0 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1bef0 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  t.        );.#el
1bf00 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
1bf10 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1bf20 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
1bf30 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1bf40 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1bf50 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
1bf60 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
1bf70 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
1bf80 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
1bf90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
1bfa0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
1bfb0 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  AP-MAP pid=%lu, 
1bfc0 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65  region=%d, offse
1bfd0 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  t=%d, size=%d, r
1bfe0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1bff0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1c000 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1c010 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1c020 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c040 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
1c050 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1c060 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1c070 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
1c080 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1c090 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1c0a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1c0b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1c0c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1c0d0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
1c0e0 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1c0f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c100 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1c110 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
1c120 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1c130 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
1c140 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
1c150 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1c160 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1c170 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
1c180 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1c190 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
1c1a0 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
1c1b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1c1c0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1c1d0 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
1c1e0 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1c1f0 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
1c200 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
1c210 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
1c220 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
1c230 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
1c240 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
1c250 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1c260 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
1c270 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
1c280 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
1c290 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
1c2a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
1c2b0 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
1c2c0 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
1c2d0 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
1c2e0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
1c2f0 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
1c300 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
1c310 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1c320 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1c330 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1c340 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1c350 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
1c360 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
1c370 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
1c380 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
1c390 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
1c3a0 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55  # define winShmU
1c3b0 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
1c3c0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
1c3d0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
1c3e0 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74  *.** Cleans up t
1c3f0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
1c400 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
1c410 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a  d file, if any..
1c420 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1c430 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74  X_MMAP_SIZE>0.st
1c440 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
1c450 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1c460 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28  File){.  assert(
1c470 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f   pFile!=0 );.  O
1c480 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c490 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c4a0 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1c4b0 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
1c4c0 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61  .           "mma
1c4d0 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70  pSize=%lld, mmap
1c4e0 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c  SizeActual=%lld,
1c4f0 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c   mmapSizeMax=%ll
1c500 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1c510 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c520 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
1c530 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46   pFile->hMap, pF
1c540 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
1c550 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1c560 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69  e->mmapSize, pFi
1c570 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1c580 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  al, pFile->mmapS
1c590 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20  izeMax));.  if( 
1c5a0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c5b0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  n ){.    if( !os
1c5c0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1c5d0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1c5e0 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  n) ){.      pFil
1c5f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1c600 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1c610 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1c620 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c630 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
1c640 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c660 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1c670 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75  MMAP\n", osGetCu
1c680 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c690 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  , pFile,.       
1c6a0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70          pFile->p
1c6b0 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
1c6c0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
1c6d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c6e0 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
1c6f0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
1c720 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
1c730 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
1c740 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1c750 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1c760 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
1c770 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1c780 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d  eActual = 0;.  }
1c790 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d  .  if( pFile->hM
1c7a0 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap!=NULL ){.    
1c7b0 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64  if( !osCloseHand
1c7c0 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20  le(pFile->hMap) 
1c7d0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1c7e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1c7f0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1c800 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e      OSTRACE(("UN
1c810 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1c820 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70  , pFile=%p, hMap
1c830 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
1c840 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20  OERR_MMAP\n",.  
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1c860 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1c870 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
1c880 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20  le->hMap));.    
1c890 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1c8a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1c8b0 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1c8c0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1c8f0 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
1c900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1c910 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
1c920 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
1c930 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1c940 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1c950 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1c960 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1c970 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1c980 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72  (), pFile));.  r
1c990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
1c9b0 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
1c9c0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
1c9d0 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1c9e0 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
1c9f0 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
1ca00 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
1ca10 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
1ca20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
1ca30 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
1ca40 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
1ca50 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
1ca60 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
1ca70 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
1ca80 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
1ca90 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
1caa0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
1cab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1cac0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1cad0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
1cae0 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
1caf0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
1cb00 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1cb10 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
1cb20 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
1cb30 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
1cb40 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
1cb50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
1cb60 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
1cb70 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
1cb80 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1cb90 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
1cba0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
1cbb0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
1cbc0 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
1cbd0 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
1cbe0 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
1cbf0 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
1cc00 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1cc10 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  E, whichever is 
1cc20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
1cc30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1cc40 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
1cc50 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
1cc60 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
1cc70 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
1cc80 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1cc90 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1cca0 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
1ccb0 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
1ccc0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
1ccd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
1cce0 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
1ccf0 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  pFd, sqlite3_int
1cd00 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c  64 nByte){.  sql
1cd10 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20  ite3_int64 nMap 
1cd20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72  = nByte;.  int r
1cd30 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  c;..  assert( nM
1cd40 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
1cd50 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
1cd60 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1cd70 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1cd80 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c  e=%p, size=%lld\
1cd90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1cda0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1cdb0 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79  ssId(), pFd, nBy
1cdc0 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64  te));..  if( pFd
1cdd0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
1cde0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cdf0 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
1ce00 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  ){.    rc = winF
1ce10 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1ce20 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61  _file*)pFd, &nMa
1ce30 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  p);.    if( rc )
1ce40 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1ce50 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1ce60 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1ce70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
1ce80 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  TAT\n",.        
1ce90 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1cea0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ceb0 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74  pFd));.      ret
1cec0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ced0 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
1cee0 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
1cef0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
1cf00 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
1cf10 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
1cf20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71  }.  nMap &= ~(sq
1cf30 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e  lite3_int64)(win
1cf40 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1cf50 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28  ze - 1);. .  if(
1cf60 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d   nMap==0 && pFd-
1cf70 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1cf80 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1cf90 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pFd);.  }.  if( 
1cfa0 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
1cfb0 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ize ){.    void 
1cfc0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44  *pNew = 0;.    D
1cfd0 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50  WORD protect = P
1cfe0 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  AGE_READONLY;.  
1cff0 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
1d000 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a  FILE_MAP_READ;..
1d010 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1d020 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28  (pFd);.    if( (
1d030 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
1d040 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29   WINFILE_RDONLY)
1d050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1d060 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
1d070 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61  WRITE;.      fla
1d080 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57  gs |= FILE_MAP_W
1d090 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RITE;.    }.#if 
1d0a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1d0b0 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1d0c0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1d0d0 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
1d0e0 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1d0f0 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
1d100 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1d110 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1d120 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
1d130 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1d140 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
1d150 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
1d190 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1d1a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1c0 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
1d1d0 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
1d1e0 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
1d1f0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1d200 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46  HAS_ANSI).    pF
1d210 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1d220 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
1d230 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1d240 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
1d270 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
1d280 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2a0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1d2b0 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
1d2c0 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
1d2d0 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
1d2e0 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
1d2f0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1d300 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1d310 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1d320 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1d330 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1d340 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1d370 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le1", pFd->zPath
1d380 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1d390 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1d3a0 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1d3b0 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1d3c0 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1d3d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1d3e0 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
1d3f0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1d400 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d410 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d420 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d430 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1d440 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1d450 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d460 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d470 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25   assert( (nMap %
1d480 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
1d490 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20  geSize)==0 );.  
1d4a0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1d4b0 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
1d4c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
1d4d0 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
1d4e0 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  fff );.#if SQLIT
1d4f0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
1d500 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
1d510 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64  fFileFromApp(pFd
1d520 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
1d530 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
1d540 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
1d550 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1d560 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
1d570 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
1d580 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
1d590 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
1d5a0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
1d5b0 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
1d5c0 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
1d5d0 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
1d5e0 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
1d5f0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1d600 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
1d610 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1d620 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1d630 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
1d640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d650 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1d660 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile2", pFd->zPat
1d670 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
1d680 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
1d690 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
1d6a0 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
1d6b0 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
1d6c0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1d6d0 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64  MAP-FILE-MAP pid
1d6e0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1d6f0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1d700 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d710 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d720 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1d730 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1d740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d750 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1d760 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
1d770 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
1d780 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
1d790 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
1d7a0 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b  zeActual = nMap;
1d7b0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1d7c0 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
1d7d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1d7e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1d7f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d800 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d810 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75  ), pFd));.  retu
1d820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d830 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d840 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1d850 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
1d860 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
1d870 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
1d880 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
1d890 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
1d8a0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
1d8b0 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
1d8c0 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
1d8d0 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
1d8e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
1d8f0 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
1d900 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
1d910 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
1d920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1d930 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
1d940 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
1d950 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
1d960 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
1d970 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
1d980 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
1d990 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
1d9a0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1d9b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
1d9c0 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
1d9d0 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
1d9e0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1d9f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1da00 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
1da10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
1da20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
1da30 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72  eventually .** r
1da40 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
1da50 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  ence by calling 
1da60 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  winUnfetch()..*/
1da70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
1da80 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
1da90 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
1daa0 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
1dab0 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
1dac0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1dad0 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
1dae0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1daf0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1db00 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
1db10 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
1db20 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41  pp = 0;..  OSTRA
1db30 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
1db40 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66  lu, pFile=%p, of
1db50 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e  fset=%lld, amoun
1db60 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a  t=%d, pp=%p\n",.
1db70 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1db80 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1db90 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41  (), fd, iOff, nA
1dba0 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53  mt, pp));..#if S
1dbb0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1dbc0 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d  IZE>0.  if( pFd-
1dbd0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29  >mmapSizeMax>0 )
1dbe0 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70  {.    if( pFd->p
1dbf0 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a  MapRegion==0 ){.
1dc00 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
1dc10 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d  inMapfile(pFd, -
1dc20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
1dc30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dc40 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1dc50 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
1dc60 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
1dc70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1dc80 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1dc90 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1dca0 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
1dcb0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
1dcc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1dcd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1dce0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  ( pFd->mmapSize 
1dcf0 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a  >= iOff+nAmt ){.
1dd00 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75        *pp = &((u
1dd10 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
1dd20 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  ion)[iOff];.    
1dd30 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
1dd40 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ++;.    }.  }.#e
1dd50 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
1dd60 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
1dd70 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70   pFile=%p, pp=%p
1dd80 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c  , *pp=%p, rc=SQL
1dd90 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1dda0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ddb0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
1ddc0 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20  d, pp, *pp));.  
1ddd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dde0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1ddf0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
1de00 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
1de10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1de20 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20   releases a .** 
1de30 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
1de40 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
1de50 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63   call to winFetc
1de60 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
1de70 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
1de80 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1de90 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
1dea0 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
1deb0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
1dec0 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
1ded0 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
1dee0 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
1def0 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
1df00 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
1df10 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
1df20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1df30 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
1df40 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
1df50 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
1df60 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
1df70 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
1df80 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
1df90 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
1dfa0 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
1dfb0 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
1dfc0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
1dfd0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1dfe0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
1dff0 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
1e000 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1e010 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
1e020 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
1e030 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
1e040 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
1e050 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
1e060 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
1e070 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
1e080 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
1e090 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
1e0a0 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65   .  ** xFetch re
1e0b0 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66  ferences. Or, if
1e0c0 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69   p!=0 (meaning i
1e0d0 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72  t is an xFetch r
1e0e0 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20  eference),.  ** 
1e0f0 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
1e100 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
1e110 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f  outstanding.  */
1e120 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30  .  assert( (p==0
1e130 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f  )==(pFd->nFetchO
1e140 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ut==0) );..  /* 
1e150 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74  If p!=0, it must
1e160 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20   match the iOff 
1e170 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65  value. */.  asse
1e180 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
1e190 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
1e1a0 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
1e1b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ..  OSTRACE(("UN
1e1c0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1e1d0 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
1e1e0 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20  %lld, p=%p\n",. 
1e1f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1e200 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1e210 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29  ), pFd, iOff, p)
1e220 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
1e230 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
1e240 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
1e250 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20    /* FIXME:  If 
1e260 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c  Windows truly al
1e270 77 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72  ways prevents tr
1e280 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65  uncating or dele
1e290 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ting a.    ** fi
1e2a0 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69  le while a mappi
1e2b0 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e  ng is held, then
1e2c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
1e2d0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61  inUnmapfile() ca
1e2e0 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e  ll.    ** is unn
1e2f0 65 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e  ecessary can can
1e300 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f   be omitted - po
1e310 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76  tentially improv
1e320 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f  ing.    ** perfo
1e330 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  rmance.  */.    
1e340 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1e350 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1e360 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
1e370 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  >=0 );.#endif.. 
1e380 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
1e390 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1e3a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1e3b0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1e3c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1e3d0 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b  ocessId(), fd));
1e3e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e3f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
1e400 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
1e410 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
1e420 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
1e430 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
1e440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e450 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
1e460 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
1e470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1e490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1e4e0 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
1e4f0 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
1e500 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
1e510 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
1e520 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
1e530 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69   win32..*/.stati
1e540 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1e550 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f  io_methods winIo
1e560 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20  Method = {.  3, 
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e590 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69  iVersion */.  wi
1e5a0 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  nClose,         
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e5c0 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e   xClose */.  win
1e5d0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5f0 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72  xRead */.  winWr
1e600 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
1e610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
1e620 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75  rite */.  winTru
1e630 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1e640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
1e650 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53  uncate */.  winS
1e660 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1e670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e680 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Sync */.  winFil
1e690 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
1e6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1e6b0 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c  leSize */.  winL
1e6c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e6e0 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c  Lock */.  winUnl
1e6f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1e700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
1e710 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65  lock */.  winChe
1e720 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
1e730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
1e740 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
1e750 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74  */.  winFileCont
1e760 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
1e770 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1e780 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63  trol */.  winSec
1e790 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
1e7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
1e7b0 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69  ctorSize */.  wi
1e7c0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
1e7d0 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a  istics,       /*
1e7e0 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
1e7f0 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e  ristics */.  win
1e800 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e820 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e  xShmMap */.  win
1e830 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e850 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
1e860 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e880 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
1e890 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20    winShmUnmap,  
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
1e8c0 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20  /.  winFetch,   
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
1e8f0 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20  .  winUnfetch   
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
1e920 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
1e930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e970 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1e980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e990 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
1e9a0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1e9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e9c0 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
1e9d0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
1e9e0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1e9f0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
1ea00 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
1ea10 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23  fs object..*/..#
1ea20 69 66 20 30 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  if 0./*.** Conve
1ea30 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72  rt a filename fr
1ea40 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20  om whatever the 
1ea50 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
1ea60 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73  ting system.** s
1ea70 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65  upports for file
1ea80 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38  names into UTF-8
1ea90 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1eaa0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a   the result is.*
1eab0 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
1eac0 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
1ead0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
1eae0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1eaf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1eb00 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74   *winConvertToUt
1eb10 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
1eb20 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
1eb30 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76  ){.  char *zConv
1eb40 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
1eb50 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
1eb60 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
1eb70 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
1eb80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
1eb90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1eba0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1ebb0 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
1ebc0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
1ebd0 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
1ebe0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
1ebf0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
1ec00 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
1ec10 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
1ec20 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
1ec30 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ted;.}.#endif../
1ec40 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
1ec50 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e  TF-8 filename in
1ec60 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
1ec70 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1ec80 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
1ec90 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61  tem wants filena
1eca0 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74  mes in.  Space t
1ecb0 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
1ecc0 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  t.** is obtained
1ecd0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
1ece0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
1ecf0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
1ed00 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
1ed10 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f  atic void *winCo
1ed20 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
1ed30 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
1ed40 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1ed50 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1ed60 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
1ed70 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
1ed80 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38  verted = winUtf8
1ed90 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
1eda0 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
1edb0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
1edc0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
1edd0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
1ede0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
1edf0 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
1ee00 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
1ee10 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
1ee20 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
1ee30 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
1ee40 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
1ee50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ee60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
1ee70 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
1ee80 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73  pecified UTF-8 s
1ee90 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20  tring buffer.** 
1eea0 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65  ends with a dire
1eeb0 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
1eec0 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
1eed0 61 74 69 63 20 69 6e 74 20 77 69 6e 45 6e 64 73  atic int winEnds
1eee0 49 6e 44 69 72 53 65 70 28 63 68 61 72 20 2a 7a  InDirSep(char *z
1eef0 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
1ef00 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
1ef10 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1ef20 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 72 65  30(zBuf);.    re
1ef30 74 75 72 6e 20 6e 4c 65 6e 3e 30 20 26 26 20 77  turn nLen>0 && w
1ef40 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b  inIsDirSep(zBuf[
1ef50 6e 4c 65 6e 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20  nLen-1]);.  }.  
1ef60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ef70 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1ef80 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1ef90 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1efa0 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20  sulting pointer 
1efb0 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54  into pzBuf..** T
1efc0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1efd0 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73  ned in pzBuf mus
1efe0 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73  t be freed via s
1eff0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
1f000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1f010 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
1f020 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
1f030 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20  har **pzBuf){.  
1f040 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1f050 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1f060 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1f070 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1f080 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1f090 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1f0a0 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
1f0b0 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
1f0c0 6e 42 75 66 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68  nBuf, nLen;.  ch
1f0d0 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20  ar *zBuf;..  /* 
1f0e0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
1f0f0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
1f100 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
1f110 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
1f120 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
1f130 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
1f140 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
1f150 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
1f160 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
1f170 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
1f180 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
1f190 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1f1a0 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
1f1b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74   /* Allocate a t
1f1c0 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
1f1d0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  to store the ful
1f1e0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
1f1f0 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20  e.  ** name for 
1f200 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
1f210 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69  le.  If this fai
1f220 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f  ls, we cannot co
1f230 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ntinue..  */.  n
1f240 42 75 66 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Buf = pVfs->mxPa
1f250 74 68 6e 61 6d 65 3b 0a 20 20 7a 42 75 66 20 3d  thname;.  zBuf =
1f260 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1f270 72 6f 28 20 6e 42 75 66 2b 32 20 29 3b 0a 20 20  ro( nBuf+2 );.  
1f280 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20  if( !zBuf ){.   
1f290 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
1f2a0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
1f2b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
1f2c0 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "));.    return 
1f2d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1f2e0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
1f2f0 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
1f300 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79  ective temporary
1f310 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72   directory.  Fir
1f320 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65  st, check if one
1f330 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65  .  ** has been e
1f340 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79  xplicitly set by
1f350 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
1f360 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65  ; otherwise, use
1f370 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f   the one.  ** co
1f380 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20  nfigured by the 
1f390 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
1f3a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f3b0 20 6e 42 75 66 3e 33 30 20 29 3b 0a 20 20 69 66   nBuf>30 );.  if
1f3c0 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
1f3d0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
1f3e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1f3f0 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20  (nBuf-30, zBuf, 
1f400 22 25 73 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  "%s%s", sqlite3_
1f410 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 0a  temp_directory,.
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 20 20 77 69 6e 45 6e 64 73 49 6e 44 69       winEndsInDi
1f440 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d  rSep(sqlite3_tem
1f450 70 5f 64 69 72 65 63 74 6f 72 79 29 20 3f 20 22  p_directory) ? "
1f460 22 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  " :.            
1f470 20 20 20 20 20 20 20 20 20 77 69 6e 47 65 74 44           winGetD
1f480 69 72 44 65 70 28 29 29 3b 0a 20 20 7d 0a 23 69  irDep());.  }.#i
1f490 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
1f4a0 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20  IN__).  else{.  
1f4b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1f4c0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
1f4d0 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  {.       0, /* g
1f4e0 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
1f4f0 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
1f500 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
1f510 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20  MPDIR") */.     
1f520 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
1f530 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  TMP") */.       
1f540 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45  0, /* getenv("TE
1f550 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
1f560 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45  , /* getenv("USE
1f570 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20  RPROFILE") */.  
1f580 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
1f590 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  .       "/usr/tm
1f5a0 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70  p",.       "/tmp
1f5b0 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20  ",.       ".",. 
1f5c0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f        0        /
1f5d0 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
1f5e0 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  r */.    };.    
1f5f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
1f600 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f610 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69  zDir = 0;..    i
1f620 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20  f( !azDirs[0] ) 
1f630 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65  azDirs[0] = gete
1f640 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
1f650 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  R");.    if( !az
1f660 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
1f670 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
1f680 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
1f690 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44  !azDirs[2] ) azD
1f6a0 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28  irs[2] = getenv(
1f6b0 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  "TMP");.    if( 
1f6c0 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44  !azDirs[3] ) azD
1f6d0 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28  irs[3] = getenv(
1f6e0 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28  "TEMP");.    if(
1f6f0 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a   !azDirs[4] ) az
1f700 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76  Dirs[4] = getenv
1f710 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
1f720 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1f730 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
1f740 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
1f750 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
1f760 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  +]){.      void 
1f770 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20  *zConverted;.   
1f780 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29     if( zDir==0 )
1f790 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f7a0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   /* If the path 
1f7b0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
1f7c0 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f  ive letter follo
1f7d0 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e  wed by the colon
1f7e0 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63  .      ** charac
1f7f0 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69  ter, assume it i
1f800 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69  s already a nati
1f810 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f  ve Win32 path; o
1f820 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
1f830 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f  ** it must be co
1f840 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74  nverted to a nat
1f850 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 70  ive Win32 path p
1f860 72 69 6f 72 20 76 69 61 20 74 68 65 20 43 79 67  rior via the Cyg
1f870 77 69 6e 0a 20 20 20 20 20 20 2a 2a 20 41 50 49  win.      ** API
1f880 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20   prior to using 
1f890 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
1f8a0 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76     if( winIsDriv
1f8b0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
1f8c0 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20  zDir) ){.       
1f8d0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
1f8e0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
1f8f0 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a  Filename(zDir);.
1f900 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
1f910 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
1f920 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
1f930 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
1f940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1f950 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
1f960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f970 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1f980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f990 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
1f9a0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
1f9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1f9c0 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20  printf(nBuf-30, 
1f9d0 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72  zBuf, "%s", zDir
1f9e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f9f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1fa00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
1fa10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1fa20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1fa30 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1fa40 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
1fa50 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72  .        zConver
1fa60 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ted = sqlite3Mal
1fa70 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 2b 31 20  locZero( nBuf+1 
1fa80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1fa90 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
1faa0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1fab0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
1fac0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1fad0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
1fae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1faf0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1fb00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fb10 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
1fb20 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
1fb30 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28           osIsNT(
1fb40 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
1fb50 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
1fb60 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69  IX_TO_WIN_A, zDi
1fb70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1fb80 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e     zConverted, n
1fb90 42 75 66 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  Buf+1)<0 ){.    
1fba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1fbb0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1fbc0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
1fbd0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
1fbe0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
1fbf0 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b  R_CONVPATH\n"));
1fc00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1fc10 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1fc20 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
1fc30 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
1fc40 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31  "winGetTempname1
1fc70 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
1fc80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1fc90 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
1fca0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
1fcb0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
1fcc0 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  nt, we know the 
1fcd0 63 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74  candidate direct
1fce0 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73  ory exists and s
1fcf0 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20  hould.          
1fd00 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77  ** be used.  How
1fd10 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65  ever, we may nee
1fd20 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65  d to convert the
1fd30 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
1fd40 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
1fd50 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54  its name into UT
1fd60 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20  F-8 (i.e. if it 
1fd70 69 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20  is UTF-16 right 
1fd80 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20  now)..          
1fd90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1fda0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
1fdb0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1fdc0 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
1fdd0 65 54 6f 55 74 66 38 28 7a 43 6f 6e 76 65 72 74  eToUtf8(zConvert
1fde0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
1fdf0 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1fe10 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1fe20 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
1fe30 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
1fe40 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
1fe50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1fe60 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
1fe70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1fe80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1fe90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1feb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
1fec0 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 22  f-30, zBuf, "%s"
1fed0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
1fee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1fef0 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
1ff00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1ff10 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1ff20 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1ff30 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
1ff40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ff50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1ff60 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c  f(nBuf-30, zBuf,
1ff70 20 22 25 73 22 2c 20 7a 43 6f 6e 76 65 72 74 65   "%s", zConverte
1ff80 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1ff90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1ffa0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
1ffb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ffc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ffd0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1ffe0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1fff0 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed);.      }.   
20000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20010 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54    }.#elif !SQLIT
20020 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
20030 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
20040 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73  _).  else if( os
20050 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  IsNT() ){.    ch
20060 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
20070 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68  LPWSTR zWidePath
20080 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
20090 5a 65 72 6f 28 20 6e 42 75 66 2a 73 69 7a 65 6f  Zero( nBuf*sizeo
200a0 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20  f(WCHAR) );.    
200b0 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29  if( !zWidePath )
200c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
200d0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
200e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
200f0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
20100 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
20110 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
20120 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
20130 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
20140 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
20150 74 68 57 28 6e 42 75 66 2c 20 7a 57 69 64 65 50  thW(nBuf, zWideP
20160 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
20170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
20180 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
20190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
201a0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
201b0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
201c0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
201d0 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
201e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
201f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
20200 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
20210 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
20220 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20240 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
20250 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e1", 0);.    }. 
20260 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55     zMulti = winU
20270 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
20280 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dePath);.    if(
20290 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20   zMulti ){.     
202a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
202b0 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c  f(nBuf-30, zBuf,
202c0 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
202d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
202e0 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ee(zMulti);.    
202f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20300 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d  WidePath);.    }
20310 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
20320 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
20330 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  th);.      sqlit
20340 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
20350 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
20360 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
20370 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
20380 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
20390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
203a0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
203b0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
203c0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
203d0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
203e0 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
203f0 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20  ar *zMbcsPath = 
20400 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
20410 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 20 20 69  o( nBuf );.    i
20420 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b  f( !zMbcsPath ){
20430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20440 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
20450 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
20460 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
20470 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
20480 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
20490 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
204a0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
204b0 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
204c0 68 41 28 6e 42 75 66 2c 20 7a 4d 62 63 73 50 61  hA(nBuf, zMbcsPa
204d0 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
204e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
204f0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
20500 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
20510 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
20520 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
20530 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
20540 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
20550 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
20560 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
20570 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
205a0 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e2", 0);.    }. 
205b0 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74     zUtf8 = sqlit
205c0 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
205d0 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29  _utf8(zMbcsPath)
205e0 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
205f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20600 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33  _snprintf(nBuf-3
20610 30 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  0, zBuf, "%s", z
20620 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
20630 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
20640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20650 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20660 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
20670 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
20680 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
20690 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
206a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
206b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
206c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
206d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
206e0 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23  32_HAS_ANSI */.#
206f0 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
20700 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20  _OS_WINRT */..  
20710 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
20720 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
20730 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
20740 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
20750 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
20760 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
20770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
20780 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65  RROR..  */.  nLe
20790 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
207a0 6e 33 30 28 7a 42 75 66 29 3b 0a 0a 20 20 69 66  n30(zBuf);..  if
207b0 28 20 28 6e 4c 65 6e 20 2b 20 73 71 6c 69 74 65  ( (nLen + sqlite
207c0 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45  3Strlen30(SQLITE
207d0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
207e0 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66  X) + 18) >= nBuf
207f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
20800 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
20810 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
20820 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
20830 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
20840 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
20850 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
20860 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
20870 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 7d  pname3", 0);.  }
20880 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
20890 69 6e 74 66 28 6e 42 75 66 2d 31 38 2d 6e 4c 65  intf(nBuf-18-nLe
208a0 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51  n, zBuf+nLen, SQ
208b0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
208c0 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73  REFIX);..  j = s
208d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
208e0 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
208f0 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
20900 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
20910 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
20920 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
20930 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
20940 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
20950 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
20960 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
20970 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
20980 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20   0;.  zBuf[j+1] 
20990 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20  = 0;.  *pzBuf = 
209a0 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45  zBuf;..  OSTRACE
209b0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
209c0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
209d0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29  ITE_OK\n", zBuf)
209e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
209f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20a00 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
20a10 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
20a20 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74   really a direct
20a30 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  ory.  Return fal
20a40 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73  se if.** it is s
20a50 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
20a60 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c  han a directory,
20a70 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
20a80 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f  any kind of memo
20a90 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
20aa0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
20ab0 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
20ac0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f  (const void *zCo
20ad0 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52  nverted){.  DWOR
20ae0 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
20af0 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
20b00 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20  stErrno;..  if( 
20b10 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
20b20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
20b30 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
20b40 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
20b50 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
20b60 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
20b70 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
20b80 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
20b90 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
20ba0 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
20bb0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
20bc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
20be0 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
20bf0 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
20c20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  && winRetryIoerr
20c30 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
20c40 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21  o) ){}.    if( !
20c50 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
20c60 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64  rn 0; /* Invalid
20c70 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a   name? */.    }.
20c80 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
20c90 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
20ca0 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54  butes;.#if SQLIT
20cb0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
20cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
20cd0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
20ce0 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
20cf0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
20d00 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  f.  }.  return (
20d10 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
20d20 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
20d30 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54  & (attr&FILE_ATT
20d40 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
20d50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
20d60 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
20d70 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
20d80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
20d90 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55  Vfs,        /* U
20da0 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d  sed to get maxim
20db0 75 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e  um path name len
20dc0 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  gth */.  const c
20dd0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
20de0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20df0 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
20e00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
20e10 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
20e20 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
20e30 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
20e40 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
20e50 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
20e60 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
20e70 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
20e80 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
20e90 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
20ea0 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
20eb0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
20ec0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
20ed0 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
20ee0 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
20ef0 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
20f00 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
20f10 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
20f20 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
20f30 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
20f40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
20f50 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
20f60 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
20f70 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
20f80 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
20f90 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fb0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
20fc0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
20fd0 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
20fe0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
20ff0 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
21000 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
21010 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
21020 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
21030 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
21040 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
21050 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
21060 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
21070 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
21080 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
21090 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
210a0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
210b0 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d  .  char *zTmpnam
210c0 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65  e = 0; /* For te
210d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
210e0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  , if necessary. 
210f0 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
21100 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
21110 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
21120 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
21130 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
21140 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
21150 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
21160 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
21170 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
21180 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
21190 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
211a0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
211b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
211c0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
211d0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
211e0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
211f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
21200 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
21210 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
21220 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
21230 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
21240 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
21250 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
21260 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21270 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
21280 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
21290 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
212a0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
212b0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
212c0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
212d0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
212e0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
212f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
21300 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
21310 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
21320 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
21330 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
21340 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
21350 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
21360 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
21370 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d   name=%s, pFile=
21380 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f  %p, flags=%x, pO
21390 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20  utFlags=%p\n",. 
213a0 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e            zUtf8N
213b0 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20  ame, id, flags, 
213c0 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20  pOutFlags));..  
213d0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
213e0 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
213f0 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
21400 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
21410 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
21420 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
21430 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
21440 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
21450 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
21460 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
21470 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
21480 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
21490 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
214a0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
214b0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
214c0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
214d0 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
214e0 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
214f0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
21500 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
21510 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
21520 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
21530 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
21540 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
21550 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
21560 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
21570 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
21580 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
21590 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
215a0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
215b0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
215c0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
215d0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
215e0 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
215f0 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
21600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
21610 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
21620 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
21630 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
21640 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
21650 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
21660 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
21670 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
21680 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
21690 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
216a0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
216b0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
216c0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
216d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
216e0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
216f0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
21700 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
21710 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
21720 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
21730 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
21740 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
21750 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
21760 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
21770 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
21780 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
21790 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
217a0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
217b0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
217c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
217d0 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
217e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
217f0 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
21800 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
21810 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
21820 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
21830 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
21840 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
21850 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
21860 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
21870 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
21880 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
21890 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
218a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
218b0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
218c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
218d0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
218e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
218f0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  =0 );.  memset(p
21900 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
21910 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  winFile));.  pFi
21920 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
21930 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23  HANDLE_VALUE;..#
21940 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
21950 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  RT.  if( !zUtf8N
21960 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f  ame && !sqlite3_
21970 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
21980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
21990 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
219a0 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
219b0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
219c0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
219d0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
219e0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
219f0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f    /* If the seco
21a00 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
21a10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21a20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61  NULL, generate a
21a30 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
21a40 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73   file name to us
21a50 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a  e .  */.  if( !z
21a60 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20  Utf8Name ){.    
21a70 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65  assert( isDelete
21a80 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e   && !isOpenJourn
21a90 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  al );.    rc = w
21aa0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  inGetTempname(pV
21ab0 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a  fs, &zTmpname);.
21ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f  TE_OK ){.      O
21ae0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
21af0 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a  me=%s, rc=%s", z
21b00 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65  Utf8Name, sqlite
21b10 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
21b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21b30 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
21b40 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
21b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62  .  }..  /* Datab
21b60 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
21b70 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
21b80 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
21b90 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52   are not.  ** UR
21ba0 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  Is with paramete
21bb0 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79  rs.  Hence, they
21bc0 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70   can always be p
21bd0 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
21be0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
21bf0 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  meter()..  */.  
21c00 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d  assert( (eType!=
21c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21c20 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26  _DB) || (flags &
21c30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
21c40 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66  ) ||.       zUtf
21c50 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  8Name[sqlite3Str
21c60 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29  len30(zUtf8Name)
21c70 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  +1]==0 );..  /* 
21c80 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
21c90 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
21ca0 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
21cb0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
21cc0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
21cd0 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
21ce0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
21cf0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
21d00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
21d10 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
21d20 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
21d30 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
21d40 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74  OERR_NOMEM", zUt
21d50 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
21d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21d70 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
21d80 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
21d90 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
21da0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
21db0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
21dc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
21dd0 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
21de0 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
21df0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54  , rc=SQLITE_CANT
21e00 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74  OPEN_ISDIR", zUt
21e10 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
21e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
21e30 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a  OPEN_ISDIR;.  }.
21e40 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
21e50 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
21e60 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
21e70 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
21e80 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
21e90 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
21ea0 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
21eb0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
21ec0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
21ed0 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
21ee0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
21ef0 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a   a new file is .
21f00 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
21f10 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
21f20 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
21f30 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
21f40 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  s" .  ** as it i
21f50 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
21f60 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tood..  */.  if(
21f70 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a   isExclusive ){.
21f80 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
21f90 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
21fa0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
21fb0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
21fc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
21fd0 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
21fe0 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
21ff0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
22000 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
22010 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43  .  }else if( isC
22020 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  reate ){.    /* 
22030 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
22040 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
22050 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
22060 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
22070 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
22080 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
22090 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
220a0 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
220b0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
220c0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
220d0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
220e0 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
220f0 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20  ..  dwShareMode 
22100 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  = FILE_SHARE_REA
22110 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
22120 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44  RITE;..  if( isD
22130 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c  elete ){.#if SQL
22140 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
22150 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
22160 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
22170 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20  RIBUTE_HIDDEN;. 
22180 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23     isTemp = 1;.#
22190 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73  else.    dwFlags
221a0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
221b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
221c0 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20  EMPORARY.       
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41          | FILE_A
221f0 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a  TTRIBUTE_HIDDEN.
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
22220 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
22230 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64  E_ON_CLOSE;.#end
22240 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
22250 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
22260 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
22270 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  IBUTE_NORMAL;.  
22280 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66  }.  /* Reports f
22290 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74  rom the internet
222a0 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72   are that perfor
222b0 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a  mance is always.
222c0 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46    ** better if F
222d0 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
222e0 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20  ACCESS is used. 
222f0 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a   Ticket #2699. *
22300 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
22310 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41  WINCE.  dwFlagsA
22320 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20  ndAttributes |= 
22330 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
22340 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a  _ACCESS;.#endif.
22350 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
22360 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
22370 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54  _WINRT.    CREAT
22380 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
22390 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e  PARAMETERS exten
223a0 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20  dedParameters;. 
223b0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
223c0 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73  eters.dwSize = s
223d0 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45  izeof(CREATEFILE
223e0 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
223f0 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65  ETERS);.    exte
22400 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
22410 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20  wFileAttributes 
22420 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77  =.            dw
22430 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
22440 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  es & FILE_ATTRIB
22450 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  UTE_MASK;.    ex
22460 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
22470 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64  .dwFileFlags = d
22480 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
22490 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f  tes & FILE_FLAG_
224a0 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
224b0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
224c0 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20  ecurityQosFlags 
224d0 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59  = SECURITY_ANONY
224e0 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64  MOUS;.    extend
224f0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53  edParameters.lpS
22500 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65  ecurityAttribute
22510 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78  s = NULL;.    ex
22520 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
22530 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d  .hTemplateFile =
22540 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65   NULL;.    while
22550 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
22560 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43  ile2((LPCWSTR)zC
22570 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22590 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
225a0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
225d0 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
22600 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64         &extended
22630 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e  Parameters))==IN
22640 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
22650 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
22680 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
22690 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
226a0 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
226b0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
226c0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
226d0 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57  reateFileW((LPCW
226e0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
22710 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
22740 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
22770 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
22780 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227a0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
227b0 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
227e0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
227f0 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
22820 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
22830 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
22840 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
22850 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  /.    }.#endif. 
22860 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
22870 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
22880 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c    else{.    whil
22890 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
228a0 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43  FileA((LPCSTR)zC
228b0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
228e0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
22910 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
22940 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
22970 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
22980 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
229b0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
229c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
229e0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
229f0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
22a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22a10 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
22a20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  }.  }.#endif.  w
22a30 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
22a40 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
22a50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
22a60 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
22a70 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55   rc=%s\n", h, zU
22a80 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  tf8Name,.       
22a90 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
22aa0 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44  ess, (h==INVALID
22ab0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f  _HANDLE_VALUE) ?
22ac0 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
22ad0 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
22ae0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
22af0 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
22b00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
22b10 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
22b20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
22b30 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e  ANTOPEN, pFile->
22b40 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f  lastErrno, "winO
22b50 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pen", zUtf8Name)
22b60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22b70 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
22b80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22b90 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
22ba0 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
22bb0 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
22bc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22bd0 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
22be0 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
22bf0 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
22c00 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
22c10 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   &.             
22c20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45          ~(SQLITE
22c30 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
22c40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22c50 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70  TE)),.         p
22c60 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
22c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
22c80 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
22c90 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
22ca0 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
22cb0 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
22cc0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
22cd0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
22ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22cf0 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
22d00 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
22d10 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
22d20 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
22d30 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  }.  }..  OSTRACE
22d40 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
22d50 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
22d60 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  =%lx, pOutFlags=
22d70 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25  %p, *pOutFlags=%
22d80 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
22d90 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55  "rc=%s\n", h, zU
22da0 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  tf8Name, dwDesir
22db0 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c  edAccess, pOutFl
22dc0 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f  ags, pOutFlags ?
22dd0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75  .           *pOu
22de0 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d  tFlags : 0, (h==
22df0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
22e00 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
22e10 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20   : "ok"));..#if 
22e20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
22e30 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
22e40 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
22e50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
22e60 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
22e70 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
22e80 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d  zName, pFile))!=
22e90 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20  SQLITE_OK.  ){. 
22ea0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
22eb0 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
22ec0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22ee0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
22ef0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
22f00 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25  N-CE-LOCK name=%
22f10 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61  s, rc=%s\n", zNa
22f20 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
22f30 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65  me(rc)));.    re
22f40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
22f50 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
22f60 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
22f70 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
22f80 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
22f90 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
22fa0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22fb0 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
22fc0 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
22fd0 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 2d 3e  ;.  }..  pFile->
22fe0 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f  pMethod = &winIo
22ff0 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
23000 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
23010 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
23020 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
23030 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
23040 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
23050 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  E_RDONLY;.  }.  
23060 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
23070 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22  boolean(zName, "
23080 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
23090 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
230a0 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
230b0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
230c0 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  NFILE_PSOW;.  }.
230d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
230e0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
230f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
23100 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54  zName;.#if SQLIT
23110 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
23120 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20  0.  pFile->hMap 
23130 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d  = NULL;.  pFile-
23140 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
23150 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
23160 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  ze = 0;.  pFile-
23170 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
23180 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
23190 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69  apSizeMax = sqli
231a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
231b0 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a  szMmap;.#endif..
231c0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
231d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
231e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
231f0 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a  the named file..
23200 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
23210 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74  Windows does not
23220 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f   allow a file to
23230 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73   be deleted if s
23240 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
23250 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e  cess has it open
23260 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76  .  Sometimes a v
23270 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20  irus scanner or 
23280 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d  indexing program
23290 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20  .** will open a 
232a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f  journal file sho
232b0 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73  rtly after it is
232c0 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65   created in orde
232d0 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65  r to do.** whate
232e0 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68  ver it does.  Wh
232f0 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70  ile this other p
23300 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
23310 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70  g the.** file op
23320 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75  en, we will be u
23330 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  nable to delete 
23340 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  it.  To work aro
23350 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62  und this.** prob
23360 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30  lem, we delay 10
23370 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
23380 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65  nd try to delete
23390 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74   again.  Up.** t
233a0 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  o MX_DELETION_AT
233b0 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20  TEMPTs deletion 
233c0 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e  attempts are run
233d0 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a   before giving.*
233e0 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  * up and returni
233f0 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
23400 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
23410 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
23420 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
23430 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
23440 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
23450 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
23460 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ame,      /* Nam
23470 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
23480 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ete */.  int syn
23490 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20  cDir            
234a0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
234b0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a   on win32 */.){.
234c0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
234d0 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
234e0 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c   attr;.  DWORD l
234f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64  astErrno;.  void
23500 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
23510 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23520 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
23530 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
23540 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
23550 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
23560 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
23570 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
23580 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
23590 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
235a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
235b0 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
235c0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
235d0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
235e0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
235f0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
23600 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
23610 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
23620 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
23630 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
23640 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
23650 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
23660 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
23670 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
23680 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
23690 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
236a0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
236b0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
236c0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
236d0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
236e0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
236f0 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
23700 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
23710 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
23720 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
23730 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
23760 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
23770 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
23780 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
23790 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
237a0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74  se{.        last
237b0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
237c0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
237d0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
237e0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
237f0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
23800 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
23810 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
23820 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
23830 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
23840 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
23850 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
23860 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
23870 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
23880 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
23890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
238a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
238b0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
238c0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
238d0 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
238e0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
238f0 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
23900 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
23910 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
23920 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
23930 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
23940 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
23950 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
23960 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
23970 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
23980 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
23990 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
239a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
239b0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
239c0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
239d0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
239e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
239f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
23a00 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
23a10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23a20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
23a30 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
23a40 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
23a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23a60 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
23a70 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
23a80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23a90 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
23aa0 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
23ab0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
23ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23ad0 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
23ae0 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
23af0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23b00 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
23b10 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
23b20 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
23b30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23b40 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
23b50 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
23b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b70 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
23b80 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
23b90 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
23ba0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
23bb0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
23bc0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
23bd0 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
23be0 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
23bf0 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
23c00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
23c10 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
23c20 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
23c30 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
23c40 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
23c50 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
23c60 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
23c70 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
23c80 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
23c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23ca0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
23cb0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
23cc0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
23cd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23ce0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23cf0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
23d10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23d20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
23d30 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
23d40 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
23d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
23d60 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
23d70 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
23d80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23d90 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
23da0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
23db0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
23dc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
23dd0 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
23de0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
23e00 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
23e10 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
23e20 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
23e30 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
23e40 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
23e50 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
23e60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
23e70 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
23e80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
23e90 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
23ea0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
23eb0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
23ec0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23ed0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
23ee0 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
23ef0 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
23f00 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
23f10 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
23f20 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
23f30 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
23f40 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
23f50 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
23f60 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
23f70 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
23f80 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
23f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23fa0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
23fb0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
23fc0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
23fd0 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
23fe0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
23ff0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
24000 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
24010 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
24020 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
24030 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
24040 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
24050 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24070 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
24080 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
24090 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
240a0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
240b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
240c0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
240d0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
240e0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
240f0 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
24100 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
24110 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
24120 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
24130 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
24140 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
24150 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
24160 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
24170 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
24180 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
24190 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
241a0 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
241b0 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
241c0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
241d0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
241e0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
241f0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
24200 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
24210 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
24220 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
24230 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
24240 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
24250 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
24260 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
24270 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
24280 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
24290 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
242a0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
242b0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
242c0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
242d0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
242e0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
242f0 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
24300 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
24310 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
24320 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24340 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
24350 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
24380 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
24390 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
243a0 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
243b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
243c0 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41   For an SQLITE_A
243d0 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65  CCESS_EXISTS que
243e0 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f  ry, treat a zero
243f0 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20  -length file.   
24400 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64     ** as if it d
24410 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
24420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
24430 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49  (    flags==SQLI
24440 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
24450 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
24460 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
24470 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20  eHigh==0 .      
24480 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
24490 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30  .nFileSizeLow==0
244a0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
244b0 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
244c0 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
244d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
244e0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
244f0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
24500 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  es;.      }.    
24510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e  }else{.      win
24520 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  LogIoerr(cnt);. 
24530 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
24540 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
24550 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74  OT_FOUND && last
24560 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54  Errno!=ERROR_PAT
24570 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
24580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24590 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
245a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
245b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
245c0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
245d0 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
245e0 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20  Access",.       
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a      zFilename);.
24610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24620 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
24630 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
24640 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
24650 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
24660 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
24670 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
24680 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
24690 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
246a0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
246b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
246c0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
246d0 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28  rted);.  switch(
246e0 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
246f0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
24700 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20  _READ:.    case 
24710 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
24720 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d  ISTS:.      rc =
24730 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
24740 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
24750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24760 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
24770 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
24780 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
24790 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
247a0 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
247b0 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20          (attr & 
247c0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
247d0 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
247e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
247f0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
24800 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
24810 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
24820 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
24830 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
24840 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
24850 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
24860 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
24870 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
24880 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
24890 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f   pResOut, *pResO
248a0 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ut));.  return S
248b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
248c0 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
248d0 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
248e0 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
248f0 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
24900 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c  ve letter.** fol
24910 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e  lowed by a colon
24920 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
24930 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
24940 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
24950 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  lon(.  const cha
24960 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
24970 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74    return ( sqlit
24980 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e  e3Isalpha(zPathn
24990 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68  ame[0]) && zPath
249a0 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a  name[1]==':' );.
249b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
249c0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
249d0 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
249e0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
249f0 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
24a00 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
24a10 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
24a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
24a30 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
24a40 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
24a50 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
24a60 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
24a70 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
24a80 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
24a90 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
24aa0 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
24ab0 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
24ac0 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
24ad0 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
24ae0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
24af0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
24b00 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
24b10 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
24b20 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
24b30 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
24b40 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
24b50 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
24b60 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
24b70 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
24b80 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
24b90 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
24ba0 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
24bb0 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
24bc0 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
24bd0 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
24be0 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
24bf0 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
24c00 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
24c10 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
24c20 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
24c30 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
24c40 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
24c50 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
24c60 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
24c70 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
24c80 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
24c90 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
24ca0 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
24cb0 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65  DirSep(zPathname
24cc0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [0]) ){.    retu
24cd0 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
24ce0 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
24cf0 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
24d00 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e  with a letter an
24d10 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20  d a colon it is 
24d20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a  either a volume.
24d30 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61    ** relative pa
24d40 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  th or an absolut
24d50 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73  e path.  Callers
24d60 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
24d70 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20  n must not.  ** 
24d80 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74  attempt to treat
24d90 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76   it as a relativ
24da0 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65  e path name (i.e
24db0 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69  . they should si
24dc0 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74  mply use.  ** it
24dd0 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f   verbatim)..  */
24de0 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69  .  if ( winIsDri
24df0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
24e00 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20  (zPathname) ){. 
24e10 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
24e20 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
24e30 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73  f we get to this
24e40 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68   point, the path
24e50 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d   name should alm
24e60 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65  ost certainly be
24e70 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72   a purely.  ** r
24e80 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65  elative one (i.e
24e90 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65  . not a UNC name
24ea0 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20  , not absolute, 
24eb0 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72  and not volume r
24ec0 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20  elative)..  */. 
24ed0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
24ee0 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
24ef0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
24f00 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
24f10 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
24f20 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
24f30 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20  me into zOut[]. 
24f40 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20   zOut[] will be 
24f50 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d  at least pVfs->m
24f60 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74  xPathname.** byt
24f70 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
24f80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c  tatic int winFul
24f90 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
24fa0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
24fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
24fc0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
24fd0 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
24fe0 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
24ff0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
25000 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
25010 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
25020 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nFull,          
25030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
25040 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
25050 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
25060 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20   char *zFull    
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25080 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
25090 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66  */.){.  .#if def
250a0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
250b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
250c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
250d0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
250e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
250f0 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ull);.  assert( 
25100 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
25110 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
25120 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
25130 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
25140 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
25150 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
25160 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
25170 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
25180 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
25190 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
251a0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
251b0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
251c0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
251d0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
251e0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
251f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
25200 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
25210 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
25220 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
25230 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
25240 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
25250 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
25260 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
25270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
25280 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
25290 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
252a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
252b0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
252c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
252d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
252e0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
252f0 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
25300 74 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f  th(CCP_POSIX_TO_
25310 57 49 4e 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49  WIN_A|CCP_RELATI
25320 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  VE, zRelative, z
25330 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
25350 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
25360 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
25370 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
25380 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
25390 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
253a0 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
253b0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
253c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
253d0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
253e0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
253f0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
25400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
25410 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
25420 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
25430 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73  e), zFull, "%s%s
25440 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
25450 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25460 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
25470 2c 20 77 69 6e 47 65 74 44 69 72 44 65 70 28 29  , winGetDirDep()
25480 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
25490 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
254a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
254b0 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
254c0 74 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f  th(CCP_POSIX_TO_
254d0 57 49 4e 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65  WIN_A, zRelative
254e0 2c 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c  , zFull, nFull)<
254f0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
25500 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
25510 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
25520 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
25530 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25550 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
25560 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
25570 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
25590 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  dif..#if (SQLITE
255a0 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
255b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26  ITE_OS_WINRT) &&
255c0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
255d0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
255e0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
255f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
25600 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
25610 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
25620 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
25630 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
25640 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54  d. */.  /* WinRT
25650 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63   has no way to c
25660 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76  onvert a relativ
25670 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73  e path to an abs
25680 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  olute one. */.  
25690 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
256a0 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
256b0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
256c0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
256d0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
256e0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
256f0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
25700 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
25710 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
25720 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
25730 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
25740 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
25750 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
25760 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
25770 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
25780 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
25790 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
257a0 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
257b0 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
257c0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
257d0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
257e0 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
257f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
25800 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
25810 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
25820 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73 25 73  , zFull, "%s%s%s
25830 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
25840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25850 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
25860 77 69 6e 47 65 74 44 69 72 44 65 70 28 29 2c 20  winGetDirDep(), 
25870 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65  zRelative);.  }e
25880 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
25890 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
258a0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
258b0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
258c0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
258d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
258e0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
258f0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
25900 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
25910 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
25920 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
25930 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b  ).  DWORD nByte;
25940 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
25950 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
25960 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
25970 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
25980 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
25990 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
259a0 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
259b0 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
259c0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
259d0 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
259e0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
259f0 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
25a00 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c  ' && winIsDriveL
25a10 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52  etterAndColon(zR
25a20 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20  elative+1) ){.  
25a30 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
25a40 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64   }..  /* It's od
25a50 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
25a60 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
25a70 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
25a80 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
25a90 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
25aa0 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
25ab0 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
25ac0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
25ad0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
25ae0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
25af0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
25b00 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
25b10 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
25b20 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
25b30 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
25b40 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
25b50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
25b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25b70 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  OR );.  if ( sql
25b80 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
25b90 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
25ba0 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
25bb0 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
25bc0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
25bd0 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
25be0 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
25bf0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
25c00 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
25c10 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
25c20 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
25c30 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
25c40 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
25c50 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
25c60 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
25c70 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
25c80 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
25c90 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
25ca0 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
25cb0 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
25cc0 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
25cd0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
25ce0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
25cf0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
25d00 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
25d10 20 22 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20   "%s%s%s",.     
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
25d40 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
25d50 72 44 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rDep(), zRelativ
25d60 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
25d70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25d80 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
25d90 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
25da0 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
25db0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
25dc0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
25dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25de0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
25df0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
25e00 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
25e10 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
25e20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
25e30 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
25e40 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
25e50 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
25e60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25e70 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25e80 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
25e90 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
25ea0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
25eb0 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
25ec0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
25ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ee0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
25ef0 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me1", zRelative)
25f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
25f10 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
25f20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
25f30 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
25f40 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
25f50 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
25f60 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
25f70 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25f80 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
25f90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
25fa0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
25fb0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
25fc0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
25fd0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
25fe0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
25ff0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
26000 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26010 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26020 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
26030 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
26040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
26050 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
26060 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
26070 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
26080 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
260a0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
260b0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
260c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
260d0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
260e0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  );.    zOut = wi
260f0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
26100 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
26110 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
26120 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
26130 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
26140 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
26150 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
26160 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
26170 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
26180 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
26190 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
261a0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
261b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
261c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
261d0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
261e0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
261f0 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
26200 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26220 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
26230 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c  Pathname3", zRel
26240 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
26250 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
26260 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
26270 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
26280 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
26290 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
262a0 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
262b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
262c0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
262d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
262e0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
262f0 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
26300 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
26310 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
26320 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
26330 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
26340 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
26350 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26360 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
26370 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
26380 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
26390 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
263a0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
263b0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
263c0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
263f0 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame4", zRelative
26400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26410 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
26420 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
26430 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
26440 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
26450 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
26460 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
26470 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
26480 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
26490 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
264a0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
264b0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
264c0 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
264d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
264e0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
264f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
26500 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
26510 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
26520 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  EM;.  }.#endif.}
26530 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26540 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
26550 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
26560 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
26570 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
26580 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
26590 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
265a0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
265b0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
265c0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
265d0 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  brary..*/./*.** 
265e0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
265f0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
26600 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
26610 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
26620 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
26630 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
26640 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
26650 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
26660 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
26670 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
26680 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
26690 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
266a0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
266b0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
266c0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
266d0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
266e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
266f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
26700 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
26710 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
26720 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
26730 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
26740 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
26750 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
26760 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
26770 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
26780 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
26790 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
267a0 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
267b0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
267c0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
267d0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
267e0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
267f0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
26800 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
26810 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
26820 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
26830 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
26840 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
26850 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
26860 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
26870 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
26880 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
26890 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
268a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
268b0 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
268c0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
268d0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
268e0 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
268f0 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
26900 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
26910 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73  fs,void *pH,cons
26920 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
26930 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  oid){.  UNUSED_P
26940 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
26950 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
26960 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f  )(void))osGetPro
26970 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c  cAddressA((HANDL
26980 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  E)pH, zSym);.}.s
26990 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
269a0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
269b0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
269c0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
269d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
269e0 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61  );.  osFreeLibra
269f0 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
26a00 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
26a10 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
26a20 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
26a30 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
26a40 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
26a50 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
26a60 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
26a70 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
26a80 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
26a90 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
26aa0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
26ab0 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
26ac0 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
26ad0 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
26ae0 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
26af0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
26b00 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
26b10 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
26b20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55  int n = 0;.  UNU
26b30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
26b40 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  fs);.#if defined
26b50 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
26b60 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
26b70 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
26b80 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
26b90 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
26ba0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
26bb0 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
26bc0 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
26bd0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
26be0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
26bf0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
26c00 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
26c10 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
26c20 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
26c30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
26c40 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
26c50 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
26c60 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
26c70 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
26c80 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  id));.    n += s
26c90 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a  izeof(pid);.  }.
26ca0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
26cb0 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  NRT.  if( sizeof
26cc0 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75  (ULONGLONG)<=nBu
26cd0 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47  f-n ){.    ULONG
26ce0 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74  LONG cnt = osGet
26cf0 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20  TickCount64();. 
26d00 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
26d10 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
26d20 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
26d30 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
26d40 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  }.#else.  if( si
26d50 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
26d60 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
26d70 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
26d80 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
26d90 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
26da0 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
26db0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
26dc0 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  f(cnt);.  }.#end
26dd0 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  if.  if( sizeof(
26de0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
26df0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
26e00 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
26e10 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
26e20 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
26e30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
26e40 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
26e50 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
26e60 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
26e70 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
26e80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
26e90 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
26ea0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
26eb0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
26ec0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
26ed0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
26ee0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
26ef0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
26f00 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
26f10 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
26f20 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
26f30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26f40 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
26f50 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
26f60 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
26f70 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
26f80 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
26f90 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
26fa0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
26fb0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
26fc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
26fd0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
26fe0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
26ff0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
27000 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
27010 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
27020 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
27030 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
27040 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
27050 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
27060 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
27070 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
27080 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
27090 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
270a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
270b0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
270c0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
270d0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
270e0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
270f0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
27100 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
27110 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
27120 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
27130 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
27140 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
27150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
27160 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
27170 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
27180 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
27190 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
271a0 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
271b0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
271c0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
271d0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
271e0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
271f0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
27200 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
27210 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
27220 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
27230 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
27240 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
27250 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
27260 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
27270 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
27280 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
27290 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
272a0 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
272b0 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
272c0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
272d0 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
272e0 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
272f0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
27300 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
27310 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
27320 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d   .  */.  FILETIM
27330 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
27340 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
27350 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
27360 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
27370 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
27380 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
27390 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
273a0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
273b0 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
273c0 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
273d0 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
273e0 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
273f0 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
27400 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
27410 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
27420 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
27430 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
27440 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20  x32BitValue = . 
27450 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
27460 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
27470 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
27480 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20  2000000000 +.   
27490 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
274a0 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69  4)294967296;..#i
274b0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
274c0 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
274d0 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74  ime;.  osGetSyst
274e0 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
274f0 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d   /* if SystemTim
27500 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61  eToFileTime() fa
27510 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ils, it returns 
27520 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21  zero. */.  if (!
27530 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
27540 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
27550 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  )){.    return S
27560 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
27570 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
27580 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
27590 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
275a0 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69  f..  *piNow = wi
275b0 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b  nFiletimeEpoch +
275c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28  .            (((
275d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
275e0 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
275f0 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29  )*max32BitValue)
27600 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
27610 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
27620 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
27630 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
27640 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
27650 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
27660 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
27670 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
27680 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
27690 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
276a0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
276b0 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
276c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
276d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
276e0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
276f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27700 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
27710 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
27720 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
27730 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
27740 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
27750 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
27760 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
27770 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
27780 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
27790 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
277a0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
277b0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
277c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
277d0 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
277e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
277f0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
27800 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
27810 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
27820 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
27830 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
27840 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
27850 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
27860 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
27870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27880 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
27890 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
278a0 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
278b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
278c0 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
278d0 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
278e0 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
278f0 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
27900 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
27910 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
27920 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
27930 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
27940 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
27950 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
27960 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
27970 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
27980 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
27990 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
279a0 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
279b0 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
279c0 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
279d0 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
279e0 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
279f0 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
27a00 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
27a10 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
27a20 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
27a30 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
27a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
27a50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
27a60 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
27a70 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
27a80 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
27a90 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
27aa0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
27ab0 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
27ac0 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
27ad0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
27ae0 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
27af0 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
27b00 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
27b10 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
27b20 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
27b30 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
27b40 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
27b50 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
27b60 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
27b70 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
27b80 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
27b90 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
27ba0 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
27bb0 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
27bc0 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
27bd0 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
27be0 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
27bf0 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
27c00 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
27c10 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
27c20 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
27c30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
27c40 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
27c50 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
27c60 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
27c70 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
27c80 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
27c90 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
27ca0 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
27cb0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
27cc0 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
27cd0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
27ce0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
27cf0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
27d00 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
27d10 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
27d20 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
27d30 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
27d40 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
27d50 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
27d60 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
27d70 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
27d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
27d90 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
27da0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27db0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
27dc0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
27dd0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
27de0 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65  ;.  return winGe
27df0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
27e00 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
27e10 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
27e20 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
27e30 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
27e40 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
27e50 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
27e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27e70 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
27e80 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
27e90 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
27ea0 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
27eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
27ec0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
27ed0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
27ee0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
27ef0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
27f00 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
27f10 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
27f20 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
27f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
27f40 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
27f50 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
27f60 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
27f70 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
27f80 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
27f90 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27fb0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
27fc0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
27fd0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
27fe0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
27ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
28000 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
28010 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
28020 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
28030 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
28040 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
28050 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
28060 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
28070 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
28080 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
28090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
280a0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
280b0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
280c0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
280d0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
280e0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
280f0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
28100 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
28110 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
28120 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
28130 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
28140 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
28150 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
28160 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
28170 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
28180 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
28190 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
281a0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
281b0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
281c0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
281d0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
281e0 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
281f0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
28200 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
28210 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
28220 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
28230 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
28240 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
28250 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
28260 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
28270 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
28280 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
282b0 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
282c0 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
282d0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
282e0 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
282f0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
28300 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
28330 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
28340 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  h",    /* zName 
28350 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
28360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
28370 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
28380 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
28390 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
283a0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
283b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
283c0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
283d0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
283e0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
283f0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
28400 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
28410 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
28420 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
28430 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
28440 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
28450 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
28460 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
28470 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
28480 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
28490 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
284a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
284b0 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
284c0 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
284d0 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
284e0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
284f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28500 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
28510 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
28520 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
28530 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
28540 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
28550 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
28560 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
28570 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
28580 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
28590 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
285a0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
285b0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
285c0 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
285d0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
285e0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
285f0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
28600 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
28610 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
28620 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  };.#endif..  /* 
28630 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
28640 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
28650 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
28660 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
28670 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
28680 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
28690 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
286a0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
286b0 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34  ze(aSyscall)==74
286c0 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65   );..  /* get me
286d0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
286e0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
286f0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
28700 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
28710 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
28720 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
28730 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74  WINRT.  osGetNat
28740 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  iveSystemInfo(&w
28750 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  inSysInfo);.#els
28760 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  e.  osGetSystemI
28770 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
28780 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
28790 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
287a0 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
287b0 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73  arity>0 );.  ass
287c0 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
287d0 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a  dwPageSize>0 );.
287e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
287f0 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
28800 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65   1);..#if define
28810 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
28820 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74  AS_WIDE).  sqlit
28830 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
28840 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c  &winLongPathVfs,
28850 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72   0);.#endif..  r
28860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28870 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
28880 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
28890 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
288a0 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
288b0 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  bj!=NULL ){.    
288c0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
288d0 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
288e0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
288f0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
28900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28910 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
28920 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.