/ Hex Artifact Content
Login

Artifact b8f54f42d9c232c48cb694b7dbe94e601c816b5c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64  or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57  ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73  AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68   several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61  at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64  vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61  ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51  rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26  LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72  _OMIT_WAL).#  er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65  ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66  quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69  NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45  le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64  _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
06c0: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
06d0: 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20   (in chars) for 
06e0: 57 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f  Win32.  This sho
06f0: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a  uld normally be.
0700: 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a  ** MAX_PATH..*/.
0710: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
0720: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48  IN32_MAX_PATH_CH
0730: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0740: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0750: 41 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58  ATH_CHARS   (MAX
0760: 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f  _PATH).#endif../
0770: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0780: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0790: 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e   chars) for WinN
07a0: 54 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  T.  This should 
07b0: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 33  normally be.** 3
07c0: 32 37 36 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2767..*/.#ifndef
07d0: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
07e0: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0800: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0810: 52 53 20 20 20 28 33 32 37 36 37 29 0a 23 65 6e  RS   (32767).#en
0820: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0830: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0840: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0850: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0860: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0870: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0880: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0890: 20 33 20 62 79 74 65 73 20 70 65 72 20 63 68 61   3 bytes per cha
08a0: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
08b0: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
08c0: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
08d0: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
08e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
08f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0900: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0910: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0920: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0930: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
0940: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
0950: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0960: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0970: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
0980: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
0990: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
09a0: 79 20 62 65 0a 2a 2a 20 33 32 37 36 37 20 2a 20  y be.** 32767 * 
09b0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a 2a  sizeof(WCHAR)..*
09c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
09d0: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
09e0: 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20  BYTES.#  define 
09f0: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0a00: 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c 0a  _PATH_BYTES   \.
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
0a30: 65 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51 4c  eof(WCHAR) * SQL
0a40: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
0a50: 54 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69 66  TH_CHARS).#endif
0a60: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0a70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65  error message le
0a80: 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20  ngth (in chars) 
0a90: 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69  for WinRT..*/.#i
0aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
0ab0: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
0ac0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ARS.#  define SQ
0ad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
0ae0: 52 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32  RRMSG_CHARS (102
0af0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0b00: 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
0b10: 6f 20 69 66 20 74 68 65 20 63 68 61 72 61 63 74  o if the charact
0b20: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65  er should be tre
0b30: 61 74 65 64 20 61 73 20 61 20 64 69 72 65 63 74  ated as a direct
0b40: 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72  ory.** separator
0b50: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e  ..*/.#ifndef win
0b60: 49 73 44 69 72 53 65 70 0a 23 20 20 64 65 66 69  IsDirSep.#  defi
0b70: 6e 65 20 77 69 6e 49 73 44 69 72 53 65 70 28 61  ne winIsDirSep(a
0b80: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
0b90: 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20 7c   (((a) == '/') |
0ba0: 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29 29  | ((a) == '\\'))
0bb0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0bc0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
0bd0: 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 6c 20 76  d when a local v
0be0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
0bf0: 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  o a value that i
0c00: 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65 73 5d  s.** [sometimes]
0c10: 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
0c20: 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 69 61 20   code (e.g. via 
0c30: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70  conditional comp
0c40: 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69 66  ilation)..*/.#if
0c50: 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 41 52 49  ndef UNUSED_VARI
0c60: 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 20 64 65  ABLE_VALUE.#  de
0c70: 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 41 52 49  fine UNUSED_VARI
0c80: 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 20 28 76  ABLE_VALUE(x) (v
0c90: 6f 69 64 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a  oid)(x).#endif..
0ca0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  /*.** Returns th
0cb0: 65 20 73 74 72 69 6e 67 20 74 68 61 74 20 73 68  e string that sh
0cc0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
0cd0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65  the directory se
0ce0: 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  parator..*/.#ifn
0cf0: 64 65 66 20 77 69 6e 47 65 74 44 69 72 44 65 70  def winGetDirDep
0d00: 0a 23 20 20 69 66 64 65 66 20 5f 5f 43 59 47 57  .#  ifdef __CYGW
0d10: 49 4e 5f 5f 0a 23 20 20 20 20 64 65 66 69 6e 65  IN__.#    define
0d20: 20 77 69 6e 47 65 74 44 69 72 44 65 70 28 29 20   winGetDirDep() 
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 22               "/"
0d40: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
0d50: 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 44 65  fine winGetDirDe
0d60: 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  p()             
0d70: 20 22 5c 5c 22 0a 23 20 20 65 6e 64 69 66 0a 23   "\\".#  endif.#
0d80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
0d90: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61  we need to manua
0da0: 6c 6c 79 20 64 65 66 69 6e 65 20 74 68 65 20 57  lly define the W
0db0: 69 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 69 6e  in32 file mappin
0dc0: 67 20 41 50 49 73 20 66 6f 72 20 75 73 65 20 77  g APIs for use w
0dd0: 69 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20  ith WAL.** mode 
0de0: 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73  (e.g. these APIs
0df0: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69   are available i
0e00: 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 20 43 45  n the Windows CE
0e10: 20 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74   SDK; however, t
0e20: 68 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 70  hey.** are not p
0e30: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65  resent in the he
0e40: 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23  ader file)?.*/.#
0e50: 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  if SQLITE_WIN32_
0e60: 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20  FILEMAPPING_API 
0e70: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f 2a 0a  TE_OMIT_WAL)./*.
0e90: 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 66 69  ** Two of the fi
0ea0: 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20  le mapping APIs 
0eb0: 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 75 6e  are different un
0ec0: 64 65 72 20 57 69 6e 52 54 2e 20 20 46 69 67 75  der WinRT.  Figu
0ed0: 72 65 20 6f 75 74 20 77 68 69 63 68 0a 2a 2a 20  re out which.** 
0ee0: 73 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a 2f 0a  set we need..*/.
0ef0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
0f00: 4e 52 54 0a 57 49 4e 42 41 53 45 41 50 49 20 48  NRT.WINBASEAPI H
0f10: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
0f20: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
0f30: 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 5c 0a  omApp(HANDLE, \.
0f40: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
0f50: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 55  TY_ATTRIBUTES, U
0f60: 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 4c  LONG, ULONG64, L
0f70: 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 41 53  PCWSTR);..WINBAS
0f80: 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41  EAPI LPVOID WINA
0f90: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
0fa0: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20  FromApp(HANDLE, 
0fb0: 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20  ULONG, ULONG64, 
0fc0: 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23  SIZE_T);.#else.#
0fd0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0fe0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
0ff0: 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e  ).WINBASEAPI HAN
1000: 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61 74  DLE WINAPI Creat
1010: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 48 41  eFileMappingA(HA
1020: 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59  NDLE, LPSECURITY
1030: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
1040: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57         DWORD, DW
1050: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 53  ORD, DWORD, LPCS
1060: 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64  TR);.#endif /* d
1070: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1080: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 2a 2f  N32_HAS_ANSI) */
1090: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
10a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
10b0: 49 44 45 29 0a 57 49 4e 42 41 53 45 41 50 49 20  IDE).WINBASEAPI 
10c0: 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72  HANDLE WINAPI Cr
10d0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
10e0: 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52  (HANDLE, LPSECUR
10f0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
1100: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
1110: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c   DWORD, DWORD, L
1120: 50 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 66 20  PCWSTR);.#endif 
1130: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1140: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1150: 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 50 49  ) */..WINBASEAPI
1160: 20 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d   LPVOID WINAPI M
1170: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e  apViewOfFile(HAN
1180: 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  DLE, DWORD, DWOR
1190: 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54  D, DWORD, SIZE_T
11a0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
11b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
11c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
11d0: 20 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20   mapping API is 
11e0: 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57  common to both W
11f0: 69 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a  in32 and WinRT..
1200: 2a 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f  */.WINBASEAPI BO
1210: 4f 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56  OL WINAPI UnmapV
1220: 69 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49  iewOfFile(LPCVOI
1230: 44 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  D);.#endif /* SQ
1240: 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d  LITE_WIN32_FILEM
1250: 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64  APPING_API && !d
1260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1270: 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_WAL) */../*.*
1280: 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
1290: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
12a0: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
12b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
12c0: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
12d0: 54 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56  TES.# define INV
12e0: 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
12f0: 55 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29  UTES ((DWORD)-1)
1300: 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65   .#endif..#ifnde
1310: 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  f FILE_FLAG_MASK
1320: 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46  .# define FILE_F
1330: 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20  LAG_MASK        
1340: 20 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23    (0xFF3C0000).#
1350: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46  endif..#ifndef F
1360: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
1370: 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45  SK.# define FILE
1380: 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20  _ATTRIBUTE_MASK 
1390: 20 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29      (0x0003FFF7)
13a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
13b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
13c0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
13d0: 72 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63 74  rences to struct
13e0: 75 72 65 73 20 75 73 65 64 20 66 6f 72 20 57 41  ures used for WA
13f0: 4c 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  L */.typedef str
1400: 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53 68  uct winShm winSh
1410: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1420: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  A connection to 
1430: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
1440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1450: 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68  winShmNode winSh
1460: 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72 65  mNode;   /* A re
1470: 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d  gion of shared-m
1480: 65 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  emory */.#endif.
1490: 0a 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63  ./*.** WinCE lac
14a0: 6b 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72  ks native suppor
14b0: 74 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69  t for file locki
14c0: 6e 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ng so we have to
14d0: 20 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68   fake it.** with
14e0: 20 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75   some code of ou
14f0: 72 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51  r own..*/.#if SQ
1500: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79  LITE_OS_WINCE.ty
1510: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
1520: 63 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e  ceLock {.  int n
1530: 52 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f  Readers;       /
1540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64  * Number of read
1550: 65 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  er locks obtaine
1560: 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e  d */.  BOOL bPen
1570: 64 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e  ding;      /* In
1580: 64 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e  dicates a pendin
1590: 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  g lock has been 
15a0: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
15b0: 4f 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20  OL bReserved;   
15c0: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
15d0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68   reserved lock h
15e0: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
15f0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c   */.  BOOL bExcl
1600: 75 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64  usive;    /* Ind
1610: 69 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73  icates an exclus
1620: 69 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ive lock has bee
1630: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20  n obtained */.} 
1640: 77 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69  winceLock;.#endi
1650: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  f../*.** The win
1660: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1670: 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20  s a subclass of 
1680: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70  sqlite3_file* sp
1690: 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69  ecific to the wi
16a0: 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69  n32.** portabili
16b0: 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70  ty layer..*/.typ
16c0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46  edef struct winF
16d0: 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72  ile winFile;.str
16e0: 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20  uct winFile {.  
16f0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1700: 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
1710: 64 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20  d; /*** Must be 
1720: 66 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c  first ***/.  sql
1730: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
1740: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
1750: 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 69  used to open thi
1760: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44  s file */.  HAND
1770: 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  LE h;           
1780: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
1790: 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  r accessing the 
17a0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63  file */.  u8 loc
17b0: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  ktype;          
17c0: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63    /* Type of loc
17d0: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
17e0: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
17f0: 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c  .  short sharedL
1800: 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61  ockByte;   /* Ra
1810: 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79  ndomly chosen by
1820: 74 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61  te used as a sha
1830: 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38  red lock */.  u8
1840: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1850: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20        /* Flags. 
1860: 20 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62   See WINFILE_* b
1870: 65 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20  elow */.  DWORD 
1880: 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
1890: 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
18a0: 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
18b0: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
18c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18d0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53  _OMIT_WAL.  winS
18e0: 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20  hm *pShm;       
18f0: 20 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20      /* Instance 
1900: 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  of shared memory
1910: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
1920: 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20  .#endif.  const 
1930: 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20  char *zPath;    
1940: 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61    /* Full pathna
1950: 6d 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  me of this file 
1960: 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b  */.  int szChunk
1970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1980: 43 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69  Chunk size confi
1990: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
19a0: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
19b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
19c0: 0a 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 74  .  LPWSTR zDelet
19d0: 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61  eOnClose;  /* Na
19e0: 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
19f0: 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e  lete when closin
1a00: 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d  g */.  HANDLE hM
1a10: 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f  utex;          /
1a20: 2a 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20  * Mutex used to 
1a30: 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
1a40: 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  o shared lock */
1a50: 20 20 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61    .  HANDLE hSha
1a60: 72 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  red;         /* 
1a70: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65  Shared memory se
1a80: 67 6d 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c  gment used for l
1a90: 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63  ocking */.  winc
1aa0: 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20  eLock local;    
1ab0: 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74      /* Locks obt
1ac0: 61 69 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e  ained by this in
1ad0: 73 74 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c  stance of winFil
1ae0: 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b  e */.  winceLock
1af0: 20 2a 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f   *shared;      /
1b00: 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20  * Global shared 
1b10: 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  lock memory for 
1b20: 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e  the file  */.#en
1b30: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
1b40: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1b50: 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20   int nFetchOut; 
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
1b80: 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72  tanding xFetch r
1b90: 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48  eferences */.  H
1ba0: 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc0: 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73  Handle for acces
1bd0: 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70  sing memory mapp
1be0: 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ing */.  void *p
1bf0: 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  MapRegion;      
1c00: 20 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d         /* Area m
1c10: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a  emory mapped */.
1c20: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1c30: 6d 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20  mmapSize;       
1c40: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
1c50: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
1c60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1c70: 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  64 mmapSizeActua
1c80: 6c 3b 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a  l; /* Actual siz
1c90: 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69  e of mapped regi
1ca0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
1cb0: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61  int64 mmapSizeMa
1cc0: 78 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75  x;    /* Configu
1cd0: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1ce0: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  IZE value */.#en
1cf0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c  dif.};../*.** Al
1d00: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72  lowed values for
1d10: 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61   winFile.ctrlFla
1d20: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  gs.*/.#define WI
1d30: 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  NFILE_RDONLY    
1d40: 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20        0x02   /* 
1d50: 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65  Connection is re
1d60: 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ad only */.#defi
1d70: 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  ne WINFILE_PERSI
1d80: 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34 20  ST_WAL     0x04 
1d90: 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20    /* Persistent 
1da0: 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66  WAL mode */.#def
1db0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  ine WINFILE_PSOW
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31 30              0x10
1dd0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43     /* SQLITE_IOC
1de0: 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1df0: 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a  RWRITE */../*. *
1e00: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
1e10: 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 20   buffer used by 
1e20: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72  sqlite3_win32_wr
1e30: 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f  ite_debug().. */
1e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e50: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
1e60: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
1e70: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
1e80: 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29 28  F_SIZE   ((int)(
1e90: 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52  4096-sizeof(DWOR
1ea0: 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  D))).#endif../*.
1eb0: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65   * The value use
1ec0: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77  d with sqlite3_w
1ed0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1ee0: 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20  ry() to specify 
1ef0: 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74 61  that. * the data
1f00: 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c   directory shoul
1f10: 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a  d be changed.. *
1f20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1f30: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
1f40: 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65  CTORY_TYPE.#  de
1f50: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1f60: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
1f70: 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69 66  _TYPE (1).#endif
1f80: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75  ../*. * The valu
1f90: 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1fa0: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1fb0: 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65  rectory() to spe
1fc0: 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65  cify that. * the
1fd0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
1fe0: 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63  tory should be c
1ff0: 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e  hanged.. */.#ifn
2000: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2010: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
2020: 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53  TYPE.#  define S
2030: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
2040: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
2050: 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (2).#endif../*. 
2060: 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  * If compiled wi
2070: 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  th SQLITE_WIN32_
2080: 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77  MALLOC on Window
2090: 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20 74  s, we will use t
20a0: 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57 69  he. * various Wi
20b0: 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75 6e  n32 API heap fun
20c0: 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f  ctions instead o
20d0: 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23  f our own.. */.#
20e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
20f0: 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a  32_MALLOC../*. *
2100: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d   If this is non-
2110: 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65  zero, an isolate
2120: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
2130: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e 61  reated by the na
2140: 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c  tive Win32. * al
2150: 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74 65  locator subsyste
2160: 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  m; otherwise, th
2170: 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65 73  e default proces
2180: 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 75  s heap will be u
2190: 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73 65  sed.  This. * se
21a0: 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66 66  tting has no eff
21b0: 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69  ect when compili
21c0: 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20 42  ng for WinRT.  B
21d0: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
21e0: 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e  is enabled. * an
21f0: 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65  d an isolated he
2200: 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  ap will be creat
2210: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20  ed to store all 
2220: 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e 0a  allocated data..
2230: 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   *. ************
2240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2280: 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49  **. * WARNING: I
2290: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
22a0: 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  o note that when
22b0: 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69 73   this setting is
22c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
22d0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77 69  e. *          wi
22e0: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e  nMemShutdown fun
22f0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2300: 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71 6c  (e.g. by the sql
2310: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a  ite3_shutdown. *
2320: 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69            functi
2330: 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74 68  on), all data th
2340: 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  at was allocated
2350: 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c 61   using the isola
2360: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a  ted heap will. *
2370: 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72 65            be fre
2380: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
2390: 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  nd any attempt t
23a0: 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66 20  o access any of 
23b0: 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20 20  that freed. *   
23c0: 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c 6c         data will
23d0: 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
23e0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
23f0: 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73 20  mmediate access 
2400: 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a  violation.. ****
2410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23  **********. */.#
2460: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
2470: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a  N32_HEAP_CREATE.
2480: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2490: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41  _WIN32_HEAP_CREA
24a0: 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 65 6e  TE    (TRUE).#en
24b0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
24c0: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
24d0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
24e0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
24f0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
2500: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2510: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
2520: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
2530: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2540: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28  HEAP_INIT_SIZE (
2550: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2560: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44         (SQLITE_D
25a0: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
25b0: 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e  ) + 4194304).#en
25c0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d  dif../*. * The m
25d0: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
25e0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
25f0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
2600: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
2610: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2620: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
2630: 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  AX_SIZE.#  defin
2640: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2650: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30  EAP_MAX_SIZE  (0
2660: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2670: 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20  The extra flags 
2680: 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20  to use in calls 
2690: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61  to the Win32 hea
26a0: 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61  p APIs.  This va
26b0: 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65  lue may be. * ze
26c0: 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75  ro for the defau
26d0: 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f  lt behavior.. */
26e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
2700: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2710: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
2720: 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69  GS     (0).#endi
2730: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69  f.../*.** The wi
2740: 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74 75  nMemData structu
2750: 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d  re stores inform
2760: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
2770: 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  y the Win32-spec
2780: 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ific.** sqlite3_
2790: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c  mem_methods impl
27a0: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  ementation..*/.t
27b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69  ypedef struct wi
27c0: 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44  nMemData winMemD
27d0: 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d  ata;.struct winM
27e0: 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66  emData {.#ifndef
27f0: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
2800: 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63  gic;    /* Magic
2810: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
2820: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
2830: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
2840: 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  f.  HANDLE hHeap
2850: 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20  ; /* The handle 
2860: 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a  to our heap. */.
2870: 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20    BOOL bOwned;  
2880: 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65  /* Do we own the
2890: 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74   heap (i.e. dest
28a0: 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f  roy it on shutdo
28b0: 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e  wn)? */.};..#ifn
28c0: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
28d0: 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  ne WINMEM_MAGIC 
28e0: 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 23      0x42b2830b.#
28f0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
2900: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2910: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
2920: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2930: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a    WINMEM_MAGIC,.
2940: 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46  #endif.  NULL, F
2950: 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ALSE.};..#ifndef
2960: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
2970: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2980: 63 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  c() assert( win_
2990: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d  mem_data.magic==
29a0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23  WINMEM_MAGIC ).#
29b0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e  else.#define win
29c0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
29d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
29e0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
29f0: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48   win_mem_data.hH
2a00: 65 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  eap..static void
2a10: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
2a20: 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74  nt nBytes);.stat
2a30: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
2a40: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
2a50: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  ;.static void *w
2a60: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
2a70: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
2a80: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69  Bytes);.static i
2a90: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
2aa0: 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69  id *p);.static i
2ab0: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
2ac0: 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20  (int n);.static 
2ad0: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
2ae0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a  oid *pAppData);.
2af0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
2b00: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
2b10: 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e  *pAppData);..con
2b20: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
2b30: 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d  ethods *sqlite3M
2b40: 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29  emGetWin32(void)
2b50: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
2b60: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
2b70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  */../*.** The fo
2b80: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2b90: 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73   is (normally) s
2ba0: 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65  et once and neve
2bb0: 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65  r changes.** the
2bc0: 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63  reafter.  It rec
2bd0: 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65  ords whether the
2be0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
2bf0: 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72  m is Win9x.** or
2c00: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a   WinNT..**.** 0:
2c10: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
2c20: 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20  tem unknown..** 
2c30: 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  1:   Operating s
2c40: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a  ystem is Win9x..
2c50: 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 2:   Operatin
2c60: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e  g system is WinN
2c70: 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  T..**.** In orde
2c80: 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  r to facilitate 
2c90: 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e  testing on a Win
2ca0: 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74  NT system, the t
2cb0: 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63  est fixture.** c
2cc0: 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20  an manually set 
2cd0: 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20  this value to 1 
2ce0: 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38  to emulate Win98
2cf0: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69   behavior..*/.#i
2d00: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2d10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2d20: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 69 66 20  type = 0;.#elif 
2d30: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2d40: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2d50: 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20  INRT && \.      
2d60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2d70: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
2d80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2d90: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
2db0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
2dc0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
2dd0: 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69   SYSCALL.#  defi
2de0: 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74  ne SYSCALL sqlit
2df0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23  e3_syscall_ptr.#
2e00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
2e10: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
2e20: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  t available on W
2e30: 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e  indows CE or Win
2e40: 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  RT.. */..#if SQL
2e50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
2e60: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2e70: 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46  #  define osAreF
2e80: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20  ileApisANSI()   
2e90: 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a      1.#endif../*
2ea0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
2eb0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
2ec0: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
2ed0: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
2ee0: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
2ef0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
2f00: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2f10: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
2f20: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
2f30: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
2f40: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
2f50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
2f60: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
2f70: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2f80: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2f90: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2fa0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
2fb0: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
2fc0: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
2fd0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
2fe0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2ff0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
3000: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3010: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
3020: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
3030: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
3040: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
3050: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
3060: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
3070: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
3080: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66  yscall[] = {.#if
3090: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
30a0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
30b0: 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69  WINRT.  { "AreFi
30c0: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20  leApisANSI",    
30d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72       (SYSCALL)Ar
30e0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20  eFileApisANSI,  
30f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3100: 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  e.  { "AreFileAp
3110: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
3120: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3150: 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c  #ifndef osAreFil
3160: 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e  eApisANSI.#defin
3170: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
3180: 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  NSI ((BOOL(WINAP
3190: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
31a0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
31b0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
31c0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
31d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
31e0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
31f0: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3210: 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57  SCALL)CharLowerW
3220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
3230: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3240: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
3250: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3260: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3270: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3280: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3290: 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c  osCharLowerW ((L
32a0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
32b0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
32c0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
32d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
32e0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
32f0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3300: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70  DE).  { "CharUpp
3310: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3320: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
3330: 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20  UpperW,         
3340: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3350: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
3360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3370: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
33a0: 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65  efine osCharUppe
33b0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
33c0: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
33d0: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
33e0: 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61  t)..  { "CloseHa
33f0: 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  ndle",          
3400: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73     (SYSCALL)Clos
3410: 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  eHandle,        
3420: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3430: 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ne osCloseHandle
3440: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3450: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
3460: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3480: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3490: 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  I).  { "CreateFi
34a0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
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 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
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 41 22   { "CreateFileA"
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 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  eA ((HANDLE(WINA
3550: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
3560: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
3570: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
3580: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
3590: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
35a0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
35b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
35c0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
35d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
35e0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
35f0: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
3600: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3610: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20  LL)CreateFileW, 
3620: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3630: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3640: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
3650: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3670: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3680: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3690: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e  reateFileW ((HAN
36a0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
36b0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
36c0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
36d0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
36e0: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
36f0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
3700: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3710: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
3720: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3730: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3740: 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20  NSI) && \.      
3750: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
3760: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
3770: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
3780: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
3790: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
37a0: 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20  appingA,      0 
37b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
37c0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
37d0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
37e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
37f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3800: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3810: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
3820: 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngA ((HANDLE(WIN
3830: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
3840: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3850: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
3860: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
3870: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
3880: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [6].pCurrent)..#
3890: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
38a0: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
38b0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
38c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
38d0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
38e0: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
38f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
3900: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3910: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
3920: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3930: 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20  FileMappingW,   
3940: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3950: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
3960: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
3970: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3990: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
39a0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
39b0: 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c  MappingW ((HANDL
39c0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
39d0: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
39e0: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
39f0: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
3a00: 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53  WORD,LPCWSTR))aS
3a10: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
3a20: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
3a30: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
3a40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3a50: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3a60: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
3a70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3a80: 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57  ALL)CreateMutexW
3a90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
3aa0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3ab0: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
3ac0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ad0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3ae0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3af0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3b00: 43 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48  CreateMutexW ((H
3b10: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3b20: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
3b30: 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20  UTES,BOOL, \.   
3b40: 20 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53       LPCWSTR))aS
3b50: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
3b60: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3b70: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3b80: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c  S_ANSI).  { "Del
3b90: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
3ba0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3bb0: 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20  DeleteFileA,    
3bc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3bd0: 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  lse.  { "DeleteF
3be0: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
3bf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3c20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65  ..#define osDele
3c30: 74 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57  teFileA ((BOOL(W
3c40: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
3c50: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
3c60: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3c70: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3c80: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44  HAS_WIDE).  { "D
3c90: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
3ca0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3cb0: 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20  L)DeleteFileW,  
3cc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3cd0: 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74  #else.  { "Delet
3ce0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3cf0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d20: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65  if..#define osDe
3d30: 6c 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c  leteFileW ((BOOL
3d40: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
3d50: 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  R))aSyscall[10].
3d60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
3d70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
3d80: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f   { "FileTimeToLo
3d90: 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  calFileTime", (S
3da0: 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54  YSCALL)FileTimeT
3db0: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20  oLocalFileTime, 
3dc0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3dd0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
3de0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
3df0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3e10: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3e20: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
3e30: 61 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f  alFileTime ((BOO
3e40: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
3e50: 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20   FILETIME*, \.  
3e60: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
3e70: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3e80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3e90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
3ea0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  { "FileTimeToSys
3eb0: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59  temTime",    (SY
3ec0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
3ed0: 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30  SystemTime,    0
3ee0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
3ef0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
3f00: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
3f10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3f20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3f30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3f40: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  osFileTimeToSyst
3f50: 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  emTime ((BOOL(WI
3f60: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
3f70: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
3f80: 20 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29    LPSYSTEMTIME))
3f90: 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75  aSyscall[12].pCu
3fa0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75  rrent)..  { "Flu
3fb0: 73 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20  shFileBuffers", 
3fc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3fd0: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
3fe0: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23  ,        0 },..#
3ff0: 64 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69  define osFlushFi
4000: 6c 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c  leBuffers ((BOOL
4010: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4020: 29 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70  ))aSyscall[13].p
4030: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4040: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4050: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4060: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41   "FormatMessageA
4070: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4080: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
4090: 67 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20  geA,          0 
40a0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
40b0: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
40c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
40d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
40e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
40f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4100: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20  sFormatMessageA 
4110: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4120: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
4130: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52  WORD,DWORD,LPSTR
4140: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
4150: 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73  D,va_list*))aSys
4160: 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e  call[14].pCurren
4170: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4190: 5f 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d  _WIDE).  { "Form
41a0: 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20  atMessageW",    
41b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
41c0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20  ormatMessageW,  
41d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
41e0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
41f0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
4200: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4230: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4240: 74 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52  tMessageW ((DWOR
4250: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4260: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4270: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
4280: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f         DWORD,va_
4290: 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  list*))aSyscall[
42a0: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  15].pCurrent)..#
42b0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
42c0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
42d0: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65  ENSION).  { "Fre
42e0: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
42f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4300: 46 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20  FreeLibrary,    
4310: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4320: 6c 73 65 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  lse.  { "FreeLib
4330: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4340: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4370: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65 65  ..#define osFree
4380: 4c 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28 57  Library ((BOOL(W
4390: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29  INAPI*)(HMODULE)
43a0: 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43  )aSyscall[16].pC
43b0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
43c0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
43d0: 64 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  d",     (SYSCALL
43e0: 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  )GetCurrentProce
43f0: 73 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  ssId,     0 },..
4400: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75 72  #define osGetCur
4410: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28 28  rentProcessId ((
4420: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
4430: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  OID))aSyscall[17
4440: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4450: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
4460: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
4470: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4480: 53 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  SI).  { "GetDisk
4490: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
44a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
44b0: 69 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20 20  iskFreeSpaceA,  
44c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
44d0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
44e0: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
44f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4520: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
4530: 72 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c  reeSpaceA ((BOOL
4540: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
4550: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
4560: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
4570: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
4580: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
4590: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
45a0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
45b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
45c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
45d0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
45e0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
45f0: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
4600: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
4610: 72 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20  reeSpaceW,      
4620: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4630: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4640: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
4650: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4670: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4680: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4690: 70 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  paceW ((BOOL(WIN
46a0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50  API*)(LPCWSTR,LP
46b0: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50  DWORD,LPDWORD,LP
46c0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
46d0: 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61   LPDWORD))aSysca
46e0: 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[19].pCurrent)
46f0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
4700: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
4710: 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  NSI).  { "GetFil
4720: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
4730: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4740: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c  FileAttributesA,
4750: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4760: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
4770: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
4780: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
47b0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
47c0: 41 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57  AttributesA ((DW
47d0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
47e0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30  STR))aSyscall[20
47f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4800: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4810: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
4820: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4830: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
4840: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
4850: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
4860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20  ileAttributesW, 
4870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4880: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4890: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
48a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
48d0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
48e0: 74 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f  ttributesW ((DWO
48f0: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  RD(WINAPI*)(LPCW
4900: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31  STR))aSyscall[21
4910: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4920: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4930: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4940: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4950: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
4960: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
4970: 74 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20  ttributesExW,   
4980: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4990: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
49a0: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
49b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
49d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
49e0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
49f0: 62 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28  butesExW ((BOOL(
4a00: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4a10: 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f  ,GET_FILEEX_INFO
4a20: 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20  _LEVELS, \.     
4a30: 20 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63     LPVOID))aSysc
4a40: 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74  all[22].pCurrent
4a50: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4a60: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
4a70: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
4a80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4a90: 47 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  GetFileSize,    
4aa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4ab0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
4ac0: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
4ad0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4b00: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
4b10: 69 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44 28  ileSize ((DWORD(
4b20: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
4b30: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4b40: 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[23].pCurrent).
4b50: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4b60: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
4b70: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4b80: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
4b90: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
4ba0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4bb0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
4bc0: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
4bd0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  lse.  { "GetFull
4be0: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
4bf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4c20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
4c30: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44  ullPathNameA ((D
4c40: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  WORD(WINAPI*)(LP
4c50: 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52  CSTR,DWORD,LPSTR
4c60: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 54  , \.        LPST
4c70: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d  R*))aSyscall[24]
4c80: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4c90: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4ca0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
4cb0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4cc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4cd0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
4ce0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
4cf0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4d00: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c  etFullPathNameW,
4d10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4d20: 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  se.  { "GetFullP
4d30: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
4d40: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4d70: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75  .#define osGetFu
4d80: 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57  llPathNameW ((DW
4d90: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
4da0: 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WSTR,DWORD,LPWST
4db0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57  R, \.        LPW
4dc0: 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32  STR*))aSyscall[2
4dd0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
4de0: 7b 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22  { "GetLastError"
4df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4e00: 53 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72  SCALL)GetLastErr
4e10: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  or,            0
4e20: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
4e30: 65 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57  etLastError ((DW
4e40: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
4e50: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e  D))aSyscall[26].
4e60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4e70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4e80: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4e90: 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ON).#if SQLITE_O
4ea0: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
4eb0: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
4ec0: 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
4ed0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
4ee0: 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20  Windows CE. */. 
4ef0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
4f00: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
4f10: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
4f20: 64 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20  dressA,         
4f30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  0 },.#else.  /* 
4f40: 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77  All other Window
4f50: 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65  s platforms expe
4f60: 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  ct GetProcAddres
4f70: 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a  s() to take.  **
4f80: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
4f90: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
4fa0: 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69  e _UNICODE setti
4fb0: 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  ng */.  { "GetPr
4fc0: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
4fd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4fe0: 74 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20  tProcAddress,   
4ff0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5000: 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  if.#else.  { "Ge
5010: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5020: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5030: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5040: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5050: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5060: 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
5070: 20 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50   ((FARPROC(WINAP
5080: 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20  I*)(HMODULE, \. 
5090: 20 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61         LPCSTR))a
50a0: 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72  Syscall[27].pCur
50b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
50c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
50d0: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
50e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
50f0: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66  ALL)GetSystemInf
5100: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  o,           0 }
5110: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5120: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
5130: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5140: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5150: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5160: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5170: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  GetSystemInfo ((
5180: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
5190: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
51a0: 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65  scall[28].pCurre
51b0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73  nt)..  { "GetSys
51c0: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20  temTime",       
51d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
51e0: 53 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20  SystemTime,     
51f0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5200: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
5210: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
5220: 49 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45  I*)(LPSYSTEMTIME
5230: 29 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70  ))aSyscall[29].p
5240: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5250: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5260: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
5270: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
5280: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
5290: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20  TimeAsFileTime, 
52a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
52b0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
52c0: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
52d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
52f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5300: 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
5310: 41 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49  AsFileTime ((VOI
5320: 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  D(WINAPI*)( \.  
5330: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
5340: 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70  ))aSyscall[30].p
5350: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
5360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5370: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
5380: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
5390: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
53a0: 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68  CALL)GetTempPath
53b0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  A,            0 
53c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
53d0: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
53e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
53f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5400: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5410: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5420: 73 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28  sGetTempPathA ((
5430: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
5440: 57 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73  WORD,LPSTR))aSys
5450: 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e  call[31].pCurren
5460: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5470: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
5480: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5490: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
54a0: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
54b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
54c0: 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c  LL)GetTempPathW,
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
54e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
54f0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
5500: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5520: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5530: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5540: 65 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57  etTempPathW ((DW
5550: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
5560: 52 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63  RD,LPWSTR))aSysc
5570: 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74  all[32].pCurrent
5580: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5590: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
55a0: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
55b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
55c0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20  GetTickCount,   
55d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
55e0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
55f0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
5600: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5630: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
5640: 69 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44  ickCount ((DWORD
5650: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
5660: 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75  aSyscall[33].pCu
5670: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5680: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5690: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
56a0: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
56b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
56c0: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41  LL)GetVersionExA
56d0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
56e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56  .#else.  { "GetV
56f0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
5700: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5720: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5730: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5740: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42  etVersionExA ((B
5750: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
5760: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53          LPOSVERS
5770: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61  IONINFOA))aSysca
5780: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[34].pCurrent)
5790: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
57a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
57b0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 56 65 72  IDE).  { "GetVer
57c0: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
57d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
57e0: 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20 20  VersionExW,     
57f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5800: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
5810: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExW",           
5820: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5850: 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73  define osGetVers
5860: 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57 49  ionExW ((BOOL(WI
5870: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5880: 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46    LPOSVERSIONINF
5890: 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  OW))aSyscall[35]
58a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
58b0: 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20  "HeapAlloc",    
58c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
58d0: 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20  ALL)HeapAlloc,  
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
58f0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
5900: 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28  pAlloc ((LPVOID(
5910: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5920: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5930: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
5940: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
5950: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5960: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 43  WINRT.  { "HeapC
5970: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
5980: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
5990: 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20 20  apCreate,       
59a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
59b0: 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  e.  { "HeapCreat
59c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
59d0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5a00: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43 72  #define osHeapCr
5a10: 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57 49  eate ((HANDLE(WI
5a20: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a  NAPI*)(DWORD,SIZ
5a30: 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20 53  E_T, \.        S
5a40: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
5a50: 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  37].pCurrent)..#
5a60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5a70: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65 73  NRT.  { "HeapDes
5a80: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
5a90: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5aa0: 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20  Destroy,        
5ab0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5ac0: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
5ad0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
5ae0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5b10: 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73 74  efine osHeapDest
5b20: 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  roy ((BOOL(WINAP
5b30: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
5b40: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
5b50: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72 65  t)..  { "HeapFre
5b60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5b70: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5b80: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
5b90: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5ba0: 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28 28  ne osHeapFree ((
5bb0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
5bc0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
5bd0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  D))aSyscall[39].
5be0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5bf0: 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20  HeapReAlloc",   
5c00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5c10: 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20  LL)HeapReAlloc, 
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5c30: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5c40: 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  ReAlloc ((LPVOID
5c50: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5c60: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c  ,DWORD,LPVOID, \
5c70: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
5c80: 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43  )aSyscall[40].pC
5c90: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
5ca0: 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20  apSize",        
5cb0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5cc0: 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20 20  )HeapSize,      
5cd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5ce0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53 69  #define osHeapSi
5cf0: 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e 41  ze ((SIZE_T(WINA
5d00: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
5d10: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
5d20: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
5d30: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5d40: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5d50: 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  RT.  { "HeapVali
5d60: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
5d70: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 56    (SYSCALL)HeapV
5d80: 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20 20  alidate,        
5d90: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5da0: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
5db0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5dc0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5df0: 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69 64  fine osHeapValid
5e00: 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ate ((BOOL(WINAP
5e10: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5e20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56  , \.        LPCV
5e30: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 32  OID))aSyscall[42
5e40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5e50: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5e60: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
5e70: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
5e80: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
5e90: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
5ea0: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
5eb0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5ec0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20  LoadLibraryA,   
5ed0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ee0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
5ef0: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
5f00: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5f30: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
5f40: 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55  LibraryA ((HMODU
5f50: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
5f60: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d  TR))aSyscall[43]
5f70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5f80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5f90: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5fa0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
5fb0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
5fc0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5fd0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
5fe0: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  ION).  { "LoadLi
5ff0: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6000: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
6010: 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20  dLibraryW,      
6020: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6030: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
6040: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
6050: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6080: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
6090: 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28  raryW ((HMODULE(
60a0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
60b0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
60c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
60d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
60e0: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6100: 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65  YSCALL)LocalFree
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6120: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6130: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
6140: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6150: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6160: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6170: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6180: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
6190: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
61a0: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
61b0: 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  45].pCurrent)..#
61c0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
61d0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
61e0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
61f0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6200: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6210: 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  LockFile,       
6220: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6230: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
6240: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6250: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6280: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
6290: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c  File.#define osL
62a0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
62b0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
62c0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
62d0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
62e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e  D))aSyscall[46].
62f0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
6300: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6310: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
6320: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6330: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
6340: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
6350: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6360: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
6370: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
6380: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
63b0: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
63c0: 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73  ileEx.#define os
63d0: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
63e0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
63f0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6400: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6410: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
6420: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  D))aSyscall[47].
6430: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
6440: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6450: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
6460: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
6470: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6480: 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d 61  IT_WAL)).  { "Ma
6490: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
64a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
64b0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
64c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
64d0: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
64e0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
64f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6520: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
6530: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56  ViewOfFile ((LPV
6540: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6550: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6560: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6570: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6580: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
6590: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54  .  { "MultiByteT
65a0: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20  oWideChar",     
65b0: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79  (SYSCALL)MultiBy
65c0: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20  teToWideChar,   
65d0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
65e0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
65f0: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41  eChar ((int(WINA
6600: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
6610: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54  LPCSTR,int,LPWST
6620: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74  R, \.        int
6630: 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70  ))aSyscall[49].p
6640: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51  Current)..  { "Q
6650: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6660: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c  ounter", (SYSCAL
6670: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  L)QueryPerforman
6680: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a  ceCounter, 0 },.
6690: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79  .#define osQuery
66a0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
66b0: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  er ((BOOL(WINAPI
66c0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41  *)( \.        LA
66d0: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53  RGE_INTEGER*))aS
66e0: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
66f0: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46  ent)..  { "ReadF
6700: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6710: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65       (SYSCALL)Re
6720: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  adFile,         
6730: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6740: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20  fine osReadFile 
6750: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6760: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57  HANDLE,LPVOID,DW
6770: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
6780: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6790: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 31  PED))aSyscall[51
67a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
67b0: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c   "SetEndOfFile",
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
67d0: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c  CALL)SetEndOfFil
67e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
67f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
6800: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f  tEndOfFile ((BOO
6810: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6820: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e  E))aSyscall[52].
6830: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6840: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6850: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
6860: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
6870: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
6880: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20  ointer,         
6890: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
68a0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
68b0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
68c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
68e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
68f0: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
6900: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
6910: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
6920: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
6930: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
6940: 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [53].pCurrent)..
6950: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6960: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
6970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6980: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
6990: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
69a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
69b0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6a00: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
6a10: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
6a20: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
6a30: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
6a40: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
6a50: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
6a60: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
6a70: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
6a80: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
6a90: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
6aa0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
6ab0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
6ac0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
6ad0: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
6ae0: 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65  scall[55].pCurre
6af0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6b00: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6b20: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b40: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
6b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6b60: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
6b70: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
6b80: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b90: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ba0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6bb0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6bc0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65  osUnlockFile.#de
6bd0: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
6be0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6bf0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6c00: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
6c10: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
6c20: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
6c30: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
6c40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
6c50: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
6c60: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
6c70: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
6c80: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
6c90: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ca0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6cc0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6ce0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6cf0: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  ne osUnlockFileE
6d00: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6d10: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6d20: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
6d30: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
6d40: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  ED))aSyscall[57]
6d50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6d60: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6d70: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
6d80: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b  TE_OMIT_WAL).  {
6d90: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
6da0: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
6db0: 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66  CALL)UnmapViewOf
6dc0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20  File,         0 
6dd0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
6de0: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
6df0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6e00: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6e10: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6e20: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6e30: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
6e40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6e50: 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61  (LPCVOID))aSysca
6e60: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
6e70: 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54  ..  { "WideCharT
6e80: 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20  oMultiByte",    
6e90: 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68   (SYSCALL)WideCh
6ea0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20  arToMultiByte,  
6eb0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6ec0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
6ed0: 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e  tiByte ((int(WIN
6ee0: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
6ef0: 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53  ,LPCWSTR,int,LPS
6f00: 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20  TR,int, \.      
6f10: 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29    LPCSTR,LPBOOL)
6f20: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
6f30: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72  urrent)..  { "Wr
6f40: 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20  iteFile",       
6f50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6f60: 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20  )WriteFile,     
6f70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6f80: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46  #define osWriteF
6f90: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6fa0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f  I*)(HANDLE,LPCVO
6fb0: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
6fc0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
6fd0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6fe0: 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[60].pCurrent)
6ff0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7000: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
7010: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
7020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
7030: 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20  eateEventExW,   
7040: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7050: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  e.  { "CreateEve
7060: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
7070: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
70a0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
70b0: 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c  EventExW ((HANDL
70c0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
70d0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
70e0: 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  ,LPCWSTR, \.    
70f0: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29      DWORD,DWORD)
7100: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
7110: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
7120: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7130: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7140: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
7150: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
7160: 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30  gleObject,     0
7170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
7180: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7190: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
71a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
71b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
71c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
71d0: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
71e0: 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49  bject ((DWORD(WI
71f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
7200: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7210: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
7220: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7230: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7240: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7250: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7260: 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c  ALL)WaitForSingl
7270: 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d  eObjectEx,   0 }
7280: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69  ,.#else.  { "Wai
7290: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
72a0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
72b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
72c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
72d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
72e0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
72f0: 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57 49  ectEx ((DWORD(WI
7300: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
7310: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 42  ORD, \.        B
7320: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 33  OOL))aSyscall[63
7330: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7340: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7350: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7360: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
7370: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
7380: 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20 20  PointerEx,      
7390: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
73a0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
73b0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
73c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
73e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
73f0: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
7400: 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  terEx ((BOOL(WIN
7410: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41 52  API*)(HANDLE,LAR
7420: 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20 20  GE_INTEGER, \.  
7430: 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e 54        PLARGE_INT
7440: 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79 73  EGER,DWORD))aSys
7450: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
7460: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7470: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
7480: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7490: 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53  yHandleEx", (SYS
74a0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66 6f  CALL)GetFileInfo
74b0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
74c0: 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  x, 0 },.#else.  
74d0: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
74e0: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
74f0: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7510: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7520: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  ine osGetFileInf
7530: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
7540: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7550: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
7560: 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f 42       FILE_INFO_B
7570: 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c  Y_HANDLE_CLASS,L
7580: 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53 79  PVOID,DWORD))aSy
7590: 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65  scall[65].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 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56 69  _WAL).  { "MapVi
75e0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
75f0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
7600: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7610: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
7620: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
7630: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
7640: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7660: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7670: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
7680: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
7690: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
76a0: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
76b0: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
76c0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
76d0: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
76e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
76f0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
7700: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
7710: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
7720: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
7730: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7740: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
7750: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
7760: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7790: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
77a0: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
77b0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
77c0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
77d0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
77e0: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
77f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
7800: 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72  Syscall[67].pCur
7810: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7820: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
7830: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7840: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
7850: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
7860: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
7870: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
7880: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
7890: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
78a0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
78b0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
78c0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
78f0: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
7900: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
7910: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
7920: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
7930: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
7940: 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [68].pCurrent)..
7950: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7960: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
7970: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
7980: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
7990: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
79a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
79b0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
79c0: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
79d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7a00: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
7a10: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
7a20: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
7a30: 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70  ))aSyscall[69].p
7a40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7a50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7a60: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
7a70: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
7a80: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
7a90: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
7aa0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
7ab0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
7ac0: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
7ad0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7ae0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7af0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7b00: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
7b10: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
7b20: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
7b30: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
7b40: 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75  aSyscall[70].pCu
7b50: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
7b60: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
7b70: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
7b80: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
7b90: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
7ba0: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
7bb0: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
7bc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
7bd0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
7be0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7bf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7c10: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
7c20: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7c30: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
7c40: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
7c50: 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[71].pCurrent)
7c60: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
7c70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
7c80: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
7c90: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
7ca0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
7cb0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
7cc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7cd0: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7ce0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
7cf0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7d20: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
7d30: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
7d40: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
7d50: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 32  STR))aSyscall[72
7d60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7d70: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
7d80: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7d90: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
7da0: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
7db0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
7dc0: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
7dd0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
7de0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 33  OID))aSyscall[73
7df0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7e00: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7e10: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
7e20: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
7e30: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
7e40: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
7e50: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
7e60: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
7e70: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7e80: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
7e90: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
7ea0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7ec0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7ed0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
7ee0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
7ef0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
7f00: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
7f10: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
7f20: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
7f30: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
7f40: 79 73 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72  yscall[74].pCurr
7f50: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
7f60: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
7f70: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
7f80: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
7f90: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
7fa0: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
7fb0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
7fc0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
7fd0: 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20  "win32" VFSes.  
7fe0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
7ff0: 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c   opon successful
8000: 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a  ly updating the.
8010: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70  ** system call p
8020: 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54  ointer, or SQLIT
8030: 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68  E_NOTFOUND if th
8040: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67  ere is no config
8050: 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d  urable.** system
8060: 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d   call named zNam
8070: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8080: 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
8090: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
80a0: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
80b0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
80c0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
80d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
80e0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
80f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
8100: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
8110: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
8120: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
8130: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
8140: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
8150: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
8160: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
8170: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
8180: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
8190: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
81a0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
81b0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
81c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
81d0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
81e0: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
81f0: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
8200: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
8210: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
8220: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
8230: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8240: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
8250: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
8260: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
8270: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
8280: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
8290: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
82a0: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
82b0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
82c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
82d0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
82e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
82f0: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
8300: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
8310: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
8320: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
8330: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
8340: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8350: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
8360: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
8370: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
8380: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
8390: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
83a0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
83b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
83c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
83d0: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
83e0: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
83f0: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
8400: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
8410: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8420: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8430: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
8440: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
8450: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
8460: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
8470: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8480: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
8490: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
84a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
84b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
84c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
84d0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
84e0: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
84f0: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
8500: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
8510: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
8520: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
8530: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
8540: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
8550: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
8560: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
8570: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
8580: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
8590: 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74 65  _ptr winGetSyste
85a0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
85b0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a  _vfs *pNotUsed,.
85c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
85d0: 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ame.){.  unsigne
85e0: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53  d int i;..  UNUS
85f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
8600: 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d  tUsed);.  for(i=
8610: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8620: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8630: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8640: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
8650: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
8660: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
8670: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
8680: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
8690: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
86a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
86b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
86c0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
86d0: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
86e0: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
86f0: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
8700: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
8710: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
8720: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
8730: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
8740: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
8750: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
8760: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
8770: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
8780: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
8790: 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65  onst char *winNe
87a0: 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c  xtSystemCall(sql
87b0: 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e  ite3_vfs *p, con
87c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
87d0: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a  .  int i = -1;..
87e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
87f0: 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61  ER(p);.  if( zNa
8800: 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  me ){.    for(i=
8810: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
8820: 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29  Syscall)-1; i++)
8830: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
8840: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
8850: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
8860: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
8870: 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c   }.  for(i++; i<
8880: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
8890: 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ll); i++){.    i
88a0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
88b0: 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74  Current!=0 ) ret
88c0: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
88d0: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74  zName;.  }.  ret
88e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
88f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75  This function ou
8900: 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69 66  tputs the specif
8910: 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e  ied (ANSI) strin
8920: 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64  g to the Win32 d
8930: 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61  ebugger.** (if a
8940: 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76  vailable)..*/..v
8950: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
8960: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f  2_write_debug(co
8970: 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  nst char *zBuf, 
8980: 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61  int nBuf){.  cha
8990: 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45  r zDbgBuf[SQLITE
89a0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
89b0: 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e  IZE];.  int nMin
89c0: 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51   = MIN(nBuf, (SQ
89d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
89e0: 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f  UF_SIZE - 1)); /
89f0: 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76  * may be negativ
8a00: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e  e. */.  if( nMin
8a10: 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b  <-1 ) nMin = -1;
8a20: 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65   /* all negative
8a30: 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d   values become -
8a40: 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  1. */.  assert( 
8a50: 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e  nMin==-1 || nMin
8a60: 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49  ==0 || nMin<SQLI
8a70: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
8a80: 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66  _SIZE );.#if def
8a90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8aa0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66  2_HAS_ANSI).  if
8ab0: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
8ac0: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
8ad0: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
8ae0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
8af0: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
8b00: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
8b10: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
8b20: 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66  gStringA(zDbgBuf
8b30: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8b40: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
8b50: 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  ingA(zBuf);.  }.
8b60: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
8b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
8b80: 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44  IDE).  memset(zD
8b90: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
8ba0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
8bb0: 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d  IZE);.  if ( osM
8bc0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
8bd0: 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73  ar(.          os
8be0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
8bf0: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
8c00: 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a  OEMCP, 0, zBuf,.
8c10: 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20            nMin, 
8c20: 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c  (LPWSTR)zDbgBuf,
8c30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
8c40: 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f  G_BUF_SIZE/sizeo
8c50: 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a  f(WCHAR))<=0 ){.
8c60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8c70: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
8c80: 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29  tringW((LPCWSTR)
8c90: 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a  zDbgBuf);.#else.
8ca0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
8cb0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
8cc0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
8cd0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
8ce0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
8cf0: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
8d00: 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  n);.    fprintf(
8d10: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44  stderr, "%s", zD
8d20: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
8d30: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
8d40: 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  err, "%s", zBuf)
8d50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
8d60: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8d70: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70  ing routine susp
8d80: 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74  ends the current
8d90: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
8da0: 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69  east ms.** milli
8db0: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
8dc0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
8dd0: 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28  the Win32 Sleep(
8de0: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
8df0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8e00: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
8e10: 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c  E sleepObj = NUL
8e20: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20  L;.#endif..void 
8e30: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
8e40: 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73  eep(DWORD millis
8e50: 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c  econds){.#if SQL
8e60: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
8e70: 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55  f ( sleepObj==NU
8e80: 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f  LL ){.    sleepO
8e90: 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65  bj = osCreateEve
8ea0: 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ntExW(NULL, NULL
8eb0: 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
8ec0: 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20  ANUAL_RESET,.   
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59 4e               SYN
8ef0: 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20  CHRONIZE);.  }. 
8f00: 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62   assert( sleepOb
8f10: 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57  j!=NULL );.  osW
8f20: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
8f30: 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d  ctEx(sleepObj, m
8f40: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c  illiseconds, FAL
8f50: 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53  SE);.#else.  osS
8f60: 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64  leep(millisecond
8f70: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  s);.#endif.}../*
8f80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
8f90: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65  (non-zero) if we
8fa0: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64   are running und
8fb0: 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c  er WinNT, Win2K,
8fc0: 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69   WinXP,.** or Wi
8fd0: 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nCE.  Return fal
8fe0: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
8ff0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
9000: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
9010: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
9020: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
9030: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
9040: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
9050: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
9060: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
9070: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
9080: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
9090: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
90a0: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
90b0: 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75   call it when ru
90c0: 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d  nning Win95/98/M
90d0: 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a  E.  A call to.**
90e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
90f0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9100: 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ne if the host i
9110: 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72  s Win95/98/ME or
9120: 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20  .** WinNT/2K/XP 
9130: 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  so that we will 
9140: 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
9150: 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c  not we can safel
9160: 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f  y call.** the Lo
9170: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a  ckFileEx() API..
9180: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49  */.#ifndef NTDDI
9190: 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65 20  _WIN8.#  define 
91a0: 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20 20  NTDDI_WIN8      
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65 6e    0x06020000.#en
91d0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
91e0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
91f0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21  TE_OS_WINRT || !
9200: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
9210: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23  IN32_HAS_ANSI).#
9220: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
9230: 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66    (1).#elif !def
9240: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9250: 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65  2_HAS_WIDE).# de
9260: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
9270: 30 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69  0).#else.  stati
9280: 63 20 69 6e 74 20 6f 73 49 73 4e 54 28 76 6f 69  c int osIsNT(voi
9290: 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  d){.    if( sqli
92a0: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29  te3_os_type==0 )
92b0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 54  {.#if defined(NT
92c0: 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20  DDI_VERSION) && 
92d0: 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d  NTDDI_VERSION >=
92e0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 20 20 20 20   NTDDI_WIN8.    
92f0: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57    OSVERSIONINFOW
9300: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49   sInfo;.      sI
9310: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
9320: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
9330: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f  (sInfo);.      o
9340: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26  sGetVersionExW(&
9350: 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
9360: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
9370: 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  OA sInfo;.      
9380: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
9390: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
93a0: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  of(sInfo);.     
93b0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
93c0: 28 26 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  (&sInfo);.#endif
93d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  .      sqlite3_o
93e0: 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64  s_type = sInfo.d
93f0: 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52  wPlatformId==VER
9400: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
9410: 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20  NT ? 2 : 1;.    
9420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  }.    return sql
9430: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b  ite3_os_type==2;
9440: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
9450: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
9460: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c  _MALLOC./*.** Al
9470: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
9480: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
9490: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
94a0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
94b0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
94c0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
94d0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
94e0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
94f0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
9500: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9510: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9520: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
9530: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
9540: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
9550: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
9560: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9570: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
9580: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
9590: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
95a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
95b0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
95c0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
95d0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
95e0: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
95f0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
9600: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9610: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
9620: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
9630: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
9640: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
9650: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
9660: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
9670: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9680: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
9690: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
96a0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
96b0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
96c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
96d0: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
96e0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
96f0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
9700: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
9710: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9720: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9730: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9740: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9750: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9760: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9770: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9780: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9790: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
97a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
97b0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
97c0: 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  E).  assert ( os
97d0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
97e0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
97f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
9800: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
9810: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72   if( !pPrior ) r
9820: 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e  eturn; /* Passin
9830: 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72  g NULL to HeapFr
9840: 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ee is undefined.
9850: 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61   */.  if( !osHea
9860: 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c  pFree(hHeap, SQL
9870: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9880: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b  LAGS, pPrior) ){
9890: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
98a0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
98b0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72  failed to HeapFr
98c0: 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75  ee block %p (%lu
98d0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
98f0: 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ior, osGetLastEr
9900: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
9910: 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eap);.  }.}../*.
9920: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
9930: 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e  ze of an existin
9940: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
9950: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
9960: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
9970: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
9980: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
9990: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
99a0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
99b0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
99c0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
99d0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
99e0: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
99f0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9a00: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
9a10: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
9a20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
9a30: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9a40: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
9a50: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
9a60: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
9a70: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
9a80: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9a90: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
9aa0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
9ab0: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
9ac0: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
9ad0: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
9ae0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9af0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
9b00: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
9b10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
9b20: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
9b30: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9b40: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
9b50: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
9b60: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
9b70: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
9b80: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9b90: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
9ba0: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
9bb0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9bd0: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
9be0: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
9bf0: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
9c00: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9c20: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9c30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
9c40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9c50: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
9c60: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
9c70: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
9c80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9c90: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
9ca0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
9cb0: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
9cc0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
9cd0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
9ce0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
9cf0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9d00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9d10: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
9d20: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
9d30: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
9d40: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
9d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9d60: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
9d70: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
9d80: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
9d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9da0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
9db0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
9dc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
9dd0: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
9de0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9df0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
9e00: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
9e10: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
9e20: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9e30: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
9e40: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
9e50: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
9e60: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
9e70: 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73       p, osGetLas
9e80: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
9e90: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74  )hHeap);.    ret
9ea0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
9eb0: 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f  urn (int)n;.}../
9ec0: 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20  *.** Round up a 
9ed0: 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20  request size to 
9ee0: 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61  the next valid a
9ef0: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a  llocation size..
9f00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
9f10: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
9f20: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  n){.  return n;.
9f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
9f40: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
9f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9f60: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
9f70: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
9f80: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
9f90: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
9fa0: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
9fb0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
9fc0: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
9fd0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
9fe0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
9ff0: 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d  >magic==WINMEM_M
a000: 41 47 49 43 20 29 3b 0a 0a 23 69 66 20 21 53 51  AGIC );..#if !SQ
a010: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
a020: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
a030: 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20  AP_CREATE.  if( 
a040: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
a050: 65 61 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d  eap ){.    pWinM
a060: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
a070: 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c  osHeapCreate(SQL
a080: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
a090: 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
a0c0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
a0d0: 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  IT_SIZE,.       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
a100: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
a110: 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _MAX_SIZE);.    
a120: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
a130: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20  ->hHeap ){.     
a140: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
a150: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
a160: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
a170: 48 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29  HeapCreate (%lu)
a180: 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74  , flags=%u, init
a190: 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65  Size=%u, maxSize
a1a0: 3d 25 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%u",.          
a1b0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
a1c0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
a1d0: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
a1e0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
a1f0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
a200: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
a210: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20  EAP_MAX_SIZE);. 
a220: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a230: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
a240: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
a250: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
a260: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
a270: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
a280: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70  );.  }.#else.  p
a290: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
a2a0: 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73  p = osGetProcess
a2b0: 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70  Heap();.  if( !p
a2c0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
a2d0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
a2e0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
a2f0: 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c  M,.        "fail
a300: 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73  ed to GetProcess
a310: 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47  Heap (%lu)", osG
a320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
a330: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a340: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
a350: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
a360: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73  ed = FALSE;.  as
a370: 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61  sert( !pWinMemDa
a380: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65  ta->bOwned );.#e
a390: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
a3a0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
a3b0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
a3c0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
a3d0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
a3e0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
a3f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
a400: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
a410: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
a420: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
a430: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
a440: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
a450: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
a460: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
a470: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
a480: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
a490: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
a4a0: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
a4b0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
a4c0: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
a4d0: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
a4e0: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
a4f0: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
a500: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
a510: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
a520: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
a530: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
a540: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
a550: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
a560: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
a570: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
a580: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
a590: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
a5a0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
a5b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
a5c0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20  C_VALIDATE).    
a5d0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
a5e0: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
a5f0: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
a600: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a610: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
a620: 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e  dif.    if( pWin
a630: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
a640: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
a650: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
a660: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
a670: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a680: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
a690: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
a6a0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75  HeapDestroy (%lu
a6b0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
a6e0: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
a6f0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
a700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
a710: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
a720: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
a730: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
a740: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
a750: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
a760: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
a770: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
a780: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
a790: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
a7a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
a7b0: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
a7c0: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
a7d0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
a7e0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
a7f0: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
a800: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
a810: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
a820: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
a830: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
a840: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
a850: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
a860: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
a870: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
a880: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
a890: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
a8a0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
a8b0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
a8c0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
a8d0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
a8e0: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
a8f0: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
a900: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
a910: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
a920: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
a930: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
a940: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
a950: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
a960: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
a970: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
a980: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
a990: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
a9a0: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
a9b0: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
a9c0: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
a9d0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
a9e0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
a9f0: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
aa00: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
aa10: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
aa20: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
aa30: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
aa40: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
aa50: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
aa60: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
aa70: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
aa80: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
aa90: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
aaa0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
aab0: 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 55  atic LPWSTR winU
aac0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  tf8ToUnicode(con
aad0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
aae0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  me){.  int nChar
aaf0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
ab00: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68  Filename;..  nCh
ab10: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
ab20: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
ab30: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
ab40: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
ab50: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
ab60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ab70: 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e    }.  zWideFilen
ab80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
ab90: 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73  locZero( nChar*s
aba0: 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
abb0: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
abc0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d   zWideFilename==
abd0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
abe0: 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d  0;.  }.  nChar =
abf0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
ac00: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
ac10: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
ac20: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
ac30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e   nChar);.  if( n
ac60: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Char==0 ){.    s
ac70: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
ac80: 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  eFilename);.    
ac90: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
aca0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
acb0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zWideFilename;.}
acc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
acd0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
ace0: 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  e to UTF-8.  Spa
acf0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
ad00: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
ad10: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
ad20: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
ad30: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
ad40: 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54  har *winUnicodeT
ad50: 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  oUtf8(LPCWSTR zW
ad60: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
ad70: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
ad80: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
ad90: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
ada0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
adb0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
adc0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
add0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
ade0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
adf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ae00: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
ae10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
ae20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
ae30: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
ae40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ae50: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
ae60: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
ae70: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
ae80: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
ae90: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
aea0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
aed0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
aee0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
aef0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
af00: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
af10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
af20: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
af30: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
af40: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
af50: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
af60: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
af70: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
af80: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
af90: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
afa0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
afb0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
afc0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
afd0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
afe0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
aff0: 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69  STR winMbcsToUni
b000: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
b010: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
b020: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
b030: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
b040: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
b050: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
b060: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
b070: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
b080: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
b090: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
b0a0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
b0b0: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b0e0: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
b0f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
b100: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b110: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
b120: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
b130: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
b140: 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65  sizeof(zMbcsFile
b150: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
b160: 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d  ( zMbcsFilename=
b170: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b180: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
b190: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
b1a0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
b1b0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
b1c0: 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  -1, zMbcsFilenam
b1d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
b200: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
b210: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
b220: 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  bcsFilename);.  
b230: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
b240: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
b250: 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b  n zMbcsFilename;
b260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
b270: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
b280: 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74  ode to multi-byt
b290: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
b2a0: 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ng, based on the
b2b0: 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20  .** user's ANSI 
b2c0: 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  codepage..**.** 
b2d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
b2e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
b2f0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
b300: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
b310: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
b320: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
b330: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
b340: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
b350: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b360: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
b370: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
b380: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
b390: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
b3a0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
b3b0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
b3c0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
b3d0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
b3e0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
b3f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
b400: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
b410: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b420: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
b430: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
b440: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
b450: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
b460: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b470: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
b480: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
b490: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
b4a0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
b4b0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
b4e0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
b4f0: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
b500: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
b510: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
b520: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
b530: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
b540: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
b550: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
b560: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
b570: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
b580: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
b590: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
b5a0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
b5b0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
b5c0: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
b5d0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
b5e0: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
b5f0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
b600: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
b610: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
b620: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
b630: 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73  mpWide = winMbcs
b640: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
b650: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
b660: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
b670: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
b680: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 77  FilenameUtf8 = w
b690: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
b6a0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
b6b0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
b6c0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
b6d0: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a  ilenameUtf8;.}..
b6e0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54  /*.** Convert UT
b6f0: 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65  F-8 to multibyte
b700: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
b710: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
b720: 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  d the .** return
b730: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
b740: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
b750: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
b760: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
b770: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
b780: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
b790: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
b7a0: 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a  *zFilenameMbcs;.
b7b0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
b7c0: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
b7d0: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
b7e0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
b7f0: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
b800: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b810: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
b820: 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Mbcs = winUnicod
b830: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
b840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
b850: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
b860: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
b870: 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  bcs;.}../*.** Th
b880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
b890: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
b8a0: 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f  ory or the tempo
b8b0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62  rary directory b
b8c0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ased on.** the p
b8d0: 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74  rovided argument
b8e0: 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67  s.  The type arg
b8f0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20  ument must be 1 
b900: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
b910: 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65  the.** data dire
b920: 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72  ctory or 2 in or
b930: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74  der to set the t
b940: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
b950: 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a  ry.  The zValue.
b960: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ** argument is t
b970: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
b980: 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e  irectory to use.
b990: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
b9a0: 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51  ue will be.** SQ
b9b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
b9c0: 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssful..*/.int sq
b9d0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
b9e0: 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20  directory(DWORD 
b9f0: 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56  type, LPCWSTR zV
ba00: 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a  alue){.  char **
ba10: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  ppDirectory = 0;
ba20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ba30: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
ba40: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
ba50: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
ba60: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ba70: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
ba80: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
ba90: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
baa0: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
bab0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
bac0: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
bad0: 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69  ctory;.  }else i
bae0: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
baf0: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
bb00: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
bb10: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
bb20: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
bb30: 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73  ectory;.  }.  as
bb40: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
bb50: 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49  ry || type==SQLI
bb60: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
bb70: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20  RECTORY_TYPE.   
bb80: 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d         || type==
bb90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
bba0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
bbb0: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
bbc0: 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20  !ppDirectory || 
bbd0: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48  sqlite3MemdebugH
bbe0: 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74  asType(*ppDirect
bbf0: 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41  ory, MEMTYPE_HEA
bc00: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69  P) );.  if( ppDi
bc10: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63  rectory ){.    c
bc20: 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20  har *zValueUtf8 
bc30: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  = 0;.    if( zVa
bc40: 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d  lue && zValue[0]
bc50: 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65   ){.      zValue
bc60: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
bc70: 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b  eToUtf8(zValue);
bc80: 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c  .      if ( zVal
bc90: 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20  ueUtf8==0 ){.   
bca0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bcb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
bcc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
bcd0: 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65  te3_free(*ppDire
bce0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44  ctory);.    *ppD
bcf0: 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75  irectory = zValu
bd00: 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72  eUtf8;.    retur
bd10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
bd20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bd30: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
bd40: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
bd50: 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45  e of winGetLastE
bd60: 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65  rrorMsg.** is ze
bd70: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
bd80: 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
bd90: 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
bda0: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
bdb0: 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
bdc0: 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
bdd0: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
bde0: 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
bdf0: 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74  orMsg(DWORD last
be00: 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c  Errno, int nBuf,
be10: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
be20: 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  /* FormatMessage
be30: 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61   returns 0 on fa
be40: 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73  ilure.  Otherwis
be50: 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  e it.  ** return
be60: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
be70: 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74  TCHARs written t
be80: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a  o the output.  *
be90: 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64  * buffer, exclud
bea0: 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ing the terminat
beb0: 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20  ing null char.. 
bec0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65   */.  DWORD dwLe
bed0: 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
bee0: 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Out = 0;..  if( 
bef0: 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
bf00: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
bf10: 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57      WCHAR zTempW
bf20: 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  ide[SQLITE_WIN32
bf30: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
bf40: 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20  S+1];.    dwLen 
bf50: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
bf60: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
bf70: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
bfa0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
bfb0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
c000: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20      zTempWide,. 
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
c070: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
c080: 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20  MSG_CHARS,.     
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73          0);.#els
c0b0: 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  e.    LPWSTR zTe
c0c0: 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20  mpWide = NULL;. 
c0d0: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
c0e0: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
c0f0: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
c100: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
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 46 4f 52 4d 41 54            FORMAT
c130: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
c140: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
c170: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
c180: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53             (LPWS
c210: 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a  TR) &zTempWide,.
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
c260: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
c270: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
c280: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
c290: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
c2a0: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
c2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
c2c0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
c2d0: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  .      zOut = wi
c2e0: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
c2f0: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20  TempWide);.     
c300: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
c310: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21  nMalloc();.#if !
c320: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
c330: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
c340: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
c350: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
c360: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
c370: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
c380: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64  zTempWide);.#end
c390: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  if.    }.  }.#if
c3a0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
c3b0: 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
c3c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
c3d0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
c3e0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
c3f0: 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45  ssageA(FORMAT_ME
c400: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
c410: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
c440: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
c450: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
c470: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
c480: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
c4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
c4d0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a        (LPSTR) &z
c520: 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Temp,.          
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
c570: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
c580: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
c590: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
c5a0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
c5b0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
c5c0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
c5d0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
c5e0: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
c5f0: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
c600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
c610: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
c620: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
c630: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
c640: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
c650: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
c660: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
c670: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
c680: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
c690: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
c6a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c6b0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
c6c0: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c  sError 0x%lx (%l
c6d0: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  u)", lastErrno, 
c6e0: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65  lastErrno);.  }e
c6f0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
c700: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
c710: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
c720: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
c730: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c740: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
c750: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
c760: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
c770: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
c780: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
c790: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
c7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68  ;.}../*.**.** Th
c7b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69  is function - wi
c7c0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
c7d0: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ) - is only ever
c7e0: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
c7f0: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45  macro.** winLogE
c800: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rror()..**.** Th
c810: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
c820: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
c830: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
c840: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  n OS function..*
c850: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  * It logs a mess
c860: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
c870: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
c880: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
c890: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  alue of.** error
c8a0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f   code and, if po
c8b0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
c8c0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
c8d0: 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46  alent from .** F
c8e0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a  ormatMessage..**
c8f0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
c900: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
c910: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
c920: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
c930: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
c940: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
c950: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
c960: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
c970: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
c980: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
c990: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
c9a0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
c9b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
c9c0: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
c9d0: 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68  ** failed and th
c9e0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
c9f0: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69  e-system path, i
ca00: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
ca10: 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c  e winLogError(a,
ca20: 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45  b,c,d)   winLogE
ca30: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
ca40: 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,d,__LINE__).sta
ca50: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72  tic int winLogEr
ca60: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
ca70: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca90: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
caa0: 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  e */.  DWORD las
cab0: 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20  tErrno,         
cac0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20         /* Win32 
cad0: 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20  last error */.  
cae0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
caf0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
cb00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
cb10: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
cb20: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
cb30: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
cb40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
cb50: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
cb60: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
cb70: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
cba0: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
cbb0: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
cbc0: 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30  .  char zMsg[500
cbd0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
cbe0: 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64     /* Human read
cbf0: 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20  able error text 
cc00: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cc30: 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b  nter */..  zMsg[
cc40: 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74  0] = 0;.  winGet
cc50: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73  LastErrorMsg(las
cc60: 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a  tErrno, sizeof(z
cc70: 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61  Msg), zMsg);.  a
cc80: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
cc90: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
cca0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
ccb0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28  ath = "";.  for(
ccc0: 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20  i=0; zMsg[i] && 
ccd0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26  zMsg[i]!='\r' &&
cce0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20   zMsg[i]!='\n'; 
ccf0: 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d  i++){}.  zMsg[i]
cd00: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
cd10: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
cd20: 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a     "os_win.c:%d:
cd30: 20 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20   (%lu) %s(%s) - 
cd40: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
cd50: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75  , lastErrno, zFu
cd60: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a  nc, zPath, zMsg.
cd70: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
cd80: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
cd90: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
cda0: 69 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64  imes that a Read
cdb0: 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c  File(), WriteFil
cdc0: 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46  e(), and DeleteF
cdd0: 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65  ile().** will be
cde0: 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69   retried followi
cdf0: 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72  ng a locking err
ce00: 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61  or - probably ca
ce10: 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69  used by .** anti
ce20: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20  virus software. 
ce30: 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61   Also the initia
ce40: 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74  l delay before t
ce50: 68 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a  he first retry..
ce60: 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63  ** The delay inc
ce70: 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20  reases linearly 
ce80: 77 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e  with each retry.
ce90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
cea0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
ceb0: 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ETRY.# define SQ
cec0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
ced0: 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66  _RETRY 10.#endif
cee0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cef0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
cf00: 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65  Y_DELAY.# define
cf10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
cf20: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20  ERR_RETRY_DELAY 
cf30: 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  25.#endif.static
cf40: 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74   int winIoerrRet
cf50: 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ry = SQLITE_WIN3
cf60: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73  2_IOERR_RETRY;.s
cf70: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65  tatic int winIoe
cf80: 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53  rrRetryDelay = S
cf90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
cfa0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a  R_RETRY_DELAY;..
cfb0: 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46  /*.** If a ReadF
cfc0: 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69  ile() or WriteFi
cfd0: 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  le() error occur
cfe0: 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  s, invoke this r
cff0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65  outine.** to see
d000: 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65   if it should be
d010: 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72   retried.  Retur
d020: 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e  n TRUE to retry.
d030: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
d040: 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74  * to give up wit
d050: 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  h an error..*/.s
d060: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 74  tatic int winRet
d070: 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52  ryIoerr(int *pnR
d080: 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72  etry, DWORD *pEr
d090: 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20  ror){.  DWORD e 
d0a0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
d0b0: 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74  ();.  if( *pnRet
d0c0: 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74 72  ry>=winIoerrRetr
d0d0: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72  y ){.    if( pEr
d0e0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  ror ){.      *pE
d0f0: 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a  rror = e;.    }.
d100: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d110: 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52  }.  if( e==ERROR
d120: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c  _ACCESS_DENIED |
d130: 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52  |.      e==ERROR
d140: 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20  _LOCK_VIOLATION 
d150: 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f  ||.      e==ERRO
d160: 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  R_SHARING_VIOLAT
d170: 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
d180: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
d190: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
d1a0: 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
d1b0: 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
d1c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
d1d0: 20 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20   }.  if( pError 
d1e0: 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  ){.    *pError =
d1f0: 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   e;.  }.  return
d200: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67   0;.}../*.** Log
d210: 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74   a I/O error ret
d220: 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73  ry episode..*/.s
d230: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f  tatic void winLo
d240: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
d250: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
d260: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d270: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
d280: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
d290: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
d2a0: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
d2b0: 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72  ",.      winIoer
d2c0: 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74  rRetryDelay*nRet
d2d0: 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a  ry*(nRetry+1)/2.
d2e0: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69      );.  }.}..#i
d2f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
d300: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
d310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
d350: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
d360: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
d370: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  inCE only..*/.#i
d380: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d390: 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
d3a0: 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45  _API) || !SQLITE
d3b0: 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f  _MSVC_LOCALTIME_
d3c0: 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53  API./*.** The MS
d3d0: 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77  VC CRT on Window
d3e0: 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76  s CE may not hav
d3f0: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
d400: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  function.  So.**
d410: 20 63 72 65 61 74 65 20 61 20 73 75 62 73 74 69   create a substi
d420: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
d430: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
d440: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
d450: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
d460: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
d470: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
d480: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
d490: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
d4a0: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
d4b0: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
d4c0: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
d4d0: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
d4e0: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
d4f0: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
d500: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
d510: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
d520: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
d530: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
d540: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69  4 >> 32);.  osFi
d550: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
d560: 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29  eTime(&uTm,&lTm)
d570: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
d580: 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c  SystemTime(&lTm,
d590: 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65  &pTm);.  y.tm_ye
d5a0: 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d  ar = pTm.wYear -
d5b0: 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f   1900;.  y.tm_mo
d5c0: 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d  n = pTm.wMonth -
d5d0: 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20   1;.  y.tm_wday 
d5e0: 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b  = pTm.wDayOfWeek
d5f0: 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20  ;.  y.tm_mday = 
d600: 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d  pTm.wDay;.  y.tm
d610: 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75  _hour = pTm.wHou
d620: 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20  r;.  y.tm_min = 
d630: 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79  pTm.wMinute;.  y
d640: 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53  .tm_sec = pTm.wS
d650: 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20  econd;.  return 
d660: 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  &y;.}.#endif..#d
d670: 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
d680: 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
d690: 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
d6a0: 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
d6b0: 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
d6c0: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
d6d0: 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
d6e0: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
d6f0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
d700: 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
d710: 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
d720: 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
d730: 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
d740: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
d750: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
d760: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
d770: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
d780: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
d790: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
d7a0: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
d7b0: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
d7c0: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
d7d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
d7e0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
d7f0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
d800: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
d810: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
d820: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
d830: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
d840: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
d850: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
d860: 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61  ic int winceCrea
d870: 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
d880: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
d890: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
d8a0: 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20   LPWSTR zTok;.  
d8b0: 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20  LPWSTR zName;.  
d8c0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
d8d0: 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20  .  BOOL bLogged 
d8e0: 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20  = FALSE;.  BOOL 
d8f0: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
d900: 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38   zName = winUtf8
d910: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
d920: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
d930: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
d940: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
d950: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d960: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
d970: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
d980: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
d990: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
d9a0: 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
d9b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
d9c0: 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
d9d0: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
d9e0: 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
d9f0: 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
da00: 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
da10: 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
da20: 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
da30: 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
da40: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
da50: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
da60: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
da70: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
da80: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
da90: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
daa0: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
dab0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
dac0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
dad0: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
dae0: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
daf0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
db00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
db10: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
db20: 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r();.    sqlite3
db30: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
db40: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
db50: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
db60: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
db70: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
db80: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
db90: 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
dba0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
dbb0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
dbc0: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
dbd0: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
dbe0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
dbf0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
dc00: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
dc10: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
dc20: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
dc30: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
dc40: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
dc50: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
dc60: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
dc70: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
dc80: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
dc90: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
dca0: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
dcb0: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
dcc0: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
dcd0: 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
dce0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
dcf0: 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
dd00: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
dd10: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
dd20: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
dd60: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
dd70: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
ddb0: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
ddc0: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
ddd0: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
dde0: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
ddf0: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
de00: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
de10: 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45  lized */.  lastE
de20: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
de30: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c  Error();.  if (l
de40: 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f  astErrno == ERRO
de50: 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53  R_ALREADY_EXISTS
de60: 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46  ){.    bInit = F
de70: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ALSE;.  }..  sql
de80: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
de90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75  ;..  /* If we su
dea0: 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e  cceeded in makin
deb0: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
dec0: 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20  ory handle, map 
ded0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  it. */.  if( pFi
dee0: 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20  le->hShared ){. 
def0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
df00: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
df10: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
df20: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
df40: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
df50: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
df60: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
df70: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
df80: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
df90: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
dfa0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
dfb0: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
dfc0: 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68    if( !pFile->sh
dfd0: 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46  ared ){.      pF
dfe0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
dff0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
e000: 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  );.      winLogE
e010: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
e020: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
e030: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
e040: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
e050: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
e060: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f  name);.      bLo
e070: 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  gged = TRUE;.   
e080: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
e090: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
e0a0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
e0b0: 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20  Shared = NULL;. 
e0c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
e0d0: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
e0e0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65  could not be cre
e0f0: 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ated, then close
e100: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66   the mutex and f
e110: 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ail */.  if( pFi
e120: 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c  le->hShared==NUL
e130: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c  L ){.    if( !bL
e140: 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70  ogged ){.      p
e150: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
e160: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
e170: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
e180: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
e190: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
e1c0: 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k3", zFilename);
e1d0: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
e1e0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20   TRUE;.    }.   
e1f0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
e200: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
e210: 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
e220: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
e230: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
e240: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
e250: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e260: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20  _IOERR;.  }.  . 
e270: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
e280: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
e290: 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
e2a0: 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62  ed to */.  if( b
e2b0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Init ){.    mems
e2c0: 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  et(pFile->shared
e2d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
e2e0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
e2f0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
e300: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
e310: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e320: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
e330: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
e340: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
e350: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
e360: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
e370: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
e380: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
e390: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
e3a0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
e3b0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
e3c0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
e3d0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
e3e0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
e3f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
e400: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
e410: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
e420: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
e430: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
e440: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
e450: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
e460: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
e470: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
e480: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
e490: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
e4a0: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
e4b0: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
e4c0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e4d0: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
e4e0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e4f0: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
e500: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
e510: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e520: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
e530: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e540: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
e550: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
e560: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
e570: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
e580: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e590: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
e5a0: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
e5b0: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
e5c0: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
e5d0: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
e5e0: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
e5f0: 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77  .    osUnmapView
e600: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
e610: 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  ared);.    osClo
e620: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
e630: 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
e640: 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
e650: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
e660: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
e670: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
e680: 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61    .    osCloseHa
e690: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
e6a0: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
e6b0: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
e6c0: 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20   }.}../* .** An 
e6d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
e6e0: 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29  f the LockFile()
e6f0: 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
e700: 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
e710: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
e720: 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
e730: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
e740: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
e750: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
e760: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
e770: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
e780: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
e790: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
e7a0: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
e7b0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
e7c0: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
e7d0: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
e7e0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
e7f0: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
e800: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
e810: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
e820: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e830: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e840: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
e850: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
e860: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
e870: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
e880: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
e890: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
e8a0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e8b0: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
e8c0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e8d0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
e8e0: 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
e8f0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
e900: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
e910: 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
e920: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
e930: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
e940: 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
e950: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
e960: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
e970: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
e980: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
e990: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
e9a0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
e9b0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
e9c0: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e9d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
e9e0: 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
e9f0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
ea00: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
ea10: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
ea20: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
ea30: 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
ea40: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
ea50: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
ea60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
ea70: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
ea80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
ea90: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
eaa0: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
eab0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
eac0: 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
ead0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
eae0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
eaf0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
eb00: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
eb10: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
eb20: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
eb30: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
eb40: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
eb50: 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
eb60: 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
eb70: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
eb80: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
eb90: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e      /* If no pen
eba0: 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
ebb0: 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 65  en acquired, the
ebc0: 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a  n acquire it */.
ebd0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
ebe0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
ebf0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
ec00: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
ec10: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
ec20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
ec30: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  .bPending = TRUE
ec40: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
ec50: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ec60: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
ec70: 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
ec80: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
ec90: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
eca0: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
ecb0: 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
ecc0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
ecd0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
ece0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
ecf0: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
ed00: 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
ed10: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
ed20: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
ed30: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
ed40: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
ed50: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
ed60: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
ed70: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
ed80: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
ed90: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
eda0: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
edb0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
edc0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
edd0: 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
ede0: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
edf0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
ee00: 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a  inceUnlockFile(.
ee10: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
ee20: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
ee30: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
ee40: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
ee50: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
ee60: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
ee70: 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
ee80: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
ee90: 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
eea0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
eeb0: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
eec0: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
eed0: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
eee0: 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
eef0: 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
ef00: 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
ef10: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
ef20: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
ef30: 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
ef40: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
ef50: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
ef60: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
ef70: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
ef80: 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
ef90: 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
efa0: 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
efb0: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
efc0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
efd0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
efe0: 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
eff0: 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
f000: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
f010: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
f020: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
f030: 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
f040: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
f050: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
f060: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
f070: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
f080: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
f090: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
f0a0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
f0b0: 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
f0c0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
f0d0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
f0e0: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
f0f0: 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
f100: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
f110: 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
f120: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
f130: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
f140: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
f150: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
f160: 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20  SHARED_SIZE.    
f170: 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d           || nNum
f180: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
f190: 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
f1a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
f1b0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
f1c0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
f1d0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
f1e0: 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
f1f0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
f200: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
f210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
f220: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
f230: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
f240: 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
f250: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
f260: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
f270: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
f280: 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20  NDING_BYTE.     
f290: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
f2a0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
f2b0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
f2c0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
f2d0: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
f2e0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
f2f0: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
f300: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
f310: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
f320: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
f330: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
f340: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
f350: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
f360: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
f370: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
f380: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
f390: 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
f3a0: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
f3b0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
f3c0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
f3d0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
f3e0: 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
f3f0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
f400: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
f410: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
f420: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
f430: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
f440: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
f450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
f460: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
f470: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
f480: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
f490: 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
f4a0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
f4b0: 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f500: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
f510: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
f520: 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  NCE */../*.** Lo
f530: 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
f540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
f550: 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20   winLockFile(.  
f560: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
f570: 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a  .  DWORD flags,.
f580: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f    DWORD offsetLo
f590: 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  w,.  DWORD offse
f5a0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
f5b0: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57  umBytesLow,.  DW
f5c0: 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ORD numBytesHigh
f5d0: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
f5e0: 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  S_WINCE.  /*.  *
f5f0: 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
f600: 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
f610: 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
f620: 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
f630: 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20  he Win32.  **   
f640: 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
f650: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
f660: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
f670: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
f680: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
f6b0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
f6c0: 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73  #else.  if( osIs
f6d0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
f6e0: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
f6f0: 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
f700: 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
f710: 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
f720: 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
f730: 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
f740: 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
f750: 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
f760: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70   osLockFileEx(*p
f770: 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c  hFile, flags, 0,
f780: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
f790: 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
f7a0: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
f7b0: 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
f7c0: 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
f7d0: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
f7e0: 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
f810: 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
f820: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
f830: 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20  a file region.. 
f840: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
f850: 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  inUnlockFile(.  
f860: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
f870: 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
f880: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
f890: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
f8a0: 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
f8b0: 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
f8c0: 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
f8d0: 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
f8e0: 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
f8f0: 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
f900: 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
f910: 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
f920: 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
f930: 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46       API UnlockF
f940: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ile..  */.  retu
f950: 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  rn winceUnlockFi
f960: 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
f970: 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
f980: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f990: 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
f9a0: 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
f9b0: 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
f9c0: 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
f9d0: 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
f9e0: 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
f9f0: 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
fa00: 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
fa10: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
fa20: 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
fa30: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
fa40: 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
fa50: 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
fa60: 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
fa70: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
fa80: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
fa90: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
faa0: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
fab0: 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
fac0: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
fad0: 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
fae0: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
fb00: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
fb10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  endif.}../******
fb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb60: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
fb70: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
fb80: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
fb90: 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
fba0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
fbb0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
fbc0: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
fbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
fc20: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
fc30: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
fc40: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
fc50: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
fc60: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
fc70: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
fc80: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
fc90: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
fca0: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
fcb0: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
fcc0: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
fcd0: 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
fce0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
fcf0: 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
fd00: 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
fd10: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
fd20: 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
fd30: 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a  ful, return 0. .
fd40: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
fd50: 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
fd60: 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
fd70: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
fd80: 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c  c int winSeekFil
fd90: 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
fda0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
fdb0: 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53  iOffset){.#if !S
fdc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
fdd0: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
fe00: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
fe10: 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
fe20: 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
fe30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
fe40: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
fe50: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
fe60: 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
fe90: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
fea0: 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f  inter() */.  DWO
feb0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fed0: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
fee0: 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
fef0: 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   */..  OSTRACE((
ff00: 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "SEEK file=%p, o
ff10: 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70  ffset=%lld\n", p
ff20: 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74  File->h, iOffset
ff30: 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73  ));..  upperBits
ff40: 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
ff50: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
ff60: 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
ff70: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
ff80: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
ff90: 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
ffa0: 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
ffb0: 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
ffc0: 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
ffd0: 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  word .  ** conta
ffe0: 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
fff0: 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
10000 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
10010 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
10020 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
10030 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
10040 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
10050 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
10060 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41  MSDN, .  ** INVA
10070 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
10080 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
10090 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
100a0 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
100b0 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
100c0 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
100d0 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65  actually occurre
100e0 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
100f0 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20  cessary to call 
10100 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
10110 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
10120 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
10130 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
10140 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
10150 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
10160 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
10170 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
10180 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
10190 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
101a0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
101b0 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
101c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
101d0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
101e0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
101f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
10200 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
10210 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
10220 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
10230 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
10240 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
10250 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
10260 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
10270 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
10280 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
10290 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
102a0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
102b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
102c0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
102d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
102e0 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
102f0 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
10300 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
10310 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
10320 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
10330 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
10340 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
10350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
10360 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
10370 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10390 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
103a0 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
103b0 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
103c0 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
103d0 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
103e0 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
103f0 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
10400 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
10410 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
10420 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10430 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10440 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
10450 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
10460 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
10470 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
10480 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
10490 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
104a0 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
104b0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
104c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
104d0 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
104e0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
104f0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
10500 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
10510 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
10520 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
10530 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
10540 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
10550 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10560 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
10570 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
10580 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
10590 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
105a0 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
105b0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
105c0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
105d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
105e0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
105f0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
10600 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
10610 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
10620 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
10630 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
10640 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
10650 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
10660 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
10670 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
10680 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
10690 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
106a0 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
106b0 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
106c0 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
106d0 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
106e0 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
106f0 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
10700 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
10710 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
10720 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
10730 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
10740 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
10750 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
10760 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
10770 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
10780 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
10790 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
107a0 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
107b0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
107c0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
107d0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
107e0 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
107f0 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
10800 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10810 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
10820 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
10830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10840 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
10850 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
10860 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
10870 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
10880 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
10890 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
108a0 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
108b0 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
108c0 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
108d0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
108e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
108f0 20 20 72 63 20 3d 20 77 69 6e 55 6e 6d 61 70 66    rc = winUnmapf
10900 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ile(pFile);.  if
10910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10920 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
10930 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72  dif..  do{.    r
10940 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
10950 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20  e(pFile->h);.   
10960 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   /* SimulateIOEr
10970 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d  ror( rc=0; cnt=M
10980 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b  X_CLOSE_ATTEMPT;
10990 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28   ); */.  }while(
109a0 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20   rc==0 && ++cnt 
109b0 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  < MX_CLOSE_ATTEM
109c0 50 54 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77  PT && (sqlite3_w
109d0 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c  in32_sleep(100),
109e0 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54   1) );.#if SQLIT
109f0 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69  E_OS_WINCE.#defi
10a00 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f  ne WINCE_DELETIO
10a10 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77  N_ATTEMPTS 3.  w
10a20 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
10a30 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46  pFile);.  if( pF
10a40 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
10a50 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
10a60 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
10a70 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
10a80 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
10a90 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
10aa0 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
10ab0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
10ac0 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
10ad0 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
10ae0 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
10af0 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
10b00 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
10b10 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
10b20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
10b30 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a  _sleep(100);  /*
10b40 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62   Wait a little b
10b50 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61  efore trying aga
10b60 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  in */.    }.    
10b70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
10b80 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
10b90 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
10ba0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10bb0 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b  pFile->h = NULL;
10bc0 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  .  }.  OpenCount
10bd0 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43  er(-1);.  OSTRAC
10be0 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25  E(("CLOSE file=%
10bf0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
10c00 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
10c10 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
10c20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
10c30 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
10c40 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
10c50 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
10c60 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
10c70 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
10ca0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
10cb0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
10cc0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
10cd0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
10ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
10cf0 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
10d00 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
10d10 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
10d20 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
10d30 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
10d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10d50 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
10d60 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
10d70 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
10d80 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
10d90 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
10da0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
10db0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
10dc0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
10dd0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
10de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10df0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
10e00 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
10e10 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
10e20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
10e30 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
10e40 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
10e50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
10e60 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
10e70 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
10e80 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
10e90 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
10ea0 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
10eb0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
10ec0 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
10ed0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
10ee0 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10f10 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
10f20 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
10f30 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f50 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
10f60 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
10f70 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
10f80 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
10f90 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
10fa0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
10fb0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
10fc0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a  TE_IOERR_READ);.
10fd0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
10fe0 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
10ff0 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
11000 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
11010 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
11020 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
11030 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
11040 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
11050 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
11060 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
11070 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
11080 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
11090 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
110a0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
110b0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
110c0 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
110d0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
110e0 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
110f0 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
11100 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
11110 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
11120 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
11130 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
11140 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
11150 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
11160 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
11170 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
11180 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 66  CE(("READ-MMAP f
11190 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
111a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
111b0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
111c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
111d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
111e0 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
111f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
11200 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
11210 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
11220 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
11230 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
11240 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
11250 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
11260 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
11270 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
11280 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
11290 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
112a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
112b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
112c0 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c    if( winSeekFil
112d0 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
112e0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
112f0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
11300 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
11310 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
11320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11330 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69  _FULL;.  }.  whi
11340 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
11350 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
11360 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20  amt, &nRead, 0) 
11370 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65  ){.#else.  memse
11380 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
11390 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
113a0 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70  PED));.  overlap
113b0 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
113c0 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
113d0 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72  fffffff);.  over
113e0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
113f0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
11400 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
11410 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  ffff);.  while( 
11420 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
11430 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
11440 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61   &nRead, &overla
11450 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20  pped) &&.       
11460 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
11470 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  ()!=ERROR_HANDLE
11480 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20  _EOF ){.#endif. 
11490 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
114a0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52  no;.    if( winR
114b0 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
114c0 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
114d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
114e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
114f0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
11500 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
11510 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
11520 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22  TE_IOERR_READ\n"
11530 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
11540 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
11550 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
11560 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c  R_READ, pFile->l
11570 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c   "winRead", pFil
115a0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
115b0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
115c0 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  try);.  if( nRea
115d0 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a  d<(DWORD)amt ){.
115e0 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
115f0 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
11600 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
11610 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
11620 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
11630 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d  f)[nRead], 0, am
11640 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53  t-nRead);.    OS
11650 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
11660 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
11670 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
11680 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
11690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
116a0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
116b0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  EAD;.  }..  OSTR
116c0 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
116d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
116e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
116f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11700 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
11710 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
11720 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
11730 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
11740 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
11750 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
11760 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
11770 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
11780 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
11790 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
117a0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
117b0 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
117c0 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
117d0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117f0 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
11800 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
11810 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11830 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11840 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
11850 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
11860 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
11870 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
11880 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
11890 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
118a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
118d0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
118e0 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
118f0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
11900 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
11910 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
11920 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
11930 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11940 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11950 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
11960 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
11970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
11980 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
11990 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
119a0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
119b0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
119c0 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
119d0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
119e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
119f0 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  TE file=%p, buff
11a00 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
11a10 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c  , offset=%lld, l
11a20 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
11a30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
11a40 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
11a50 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
11a60 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
11a70 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
11a80 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
11a90 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
11aa0 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
11ab0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
11ac0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
11ad0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
11ae0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
11af0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
11b00 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
11b10 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
11b20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
11b30 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
11b40 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
11b50 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
11b60 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
11b70 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
11b80 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
11b90 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d  TRACE(("WRITE-MM
11ba0 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
11bb0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
11bc0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
11bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11bf0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
11c00 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
11c10 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
11c20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
11c30 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
11c40 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
11c50 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
11c60 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
11c70 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
11c80 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
11c90 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
11ca0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
11cb0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
11cc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
11cd0 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e 53 65  NCE.  rc = winSe
11ce0 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  ekFile(pFile, of
11cf0 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
11d00 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a  =0 ){.#else.  {.
11d10 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
11d20 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
11d30 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
11d40 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
11d50 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
11d60 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
11d70 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
11d80 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
11d90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
11da0 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
11db0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
11dc0 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
11dd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11de0 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
11df0 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
11e00 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
11e30 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
11e40 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
11e50 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11e60 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
11e70 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
11e80 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
11e90 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
11ea0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
11eb0 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
11ec0 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
11ed0 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
11ee0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
11ef0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
11f00 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
11f10 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
11f20 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
11f30 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
11f40 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
11f50 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c  #endif..    whil
11f60 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66  e( nRem>0 ){.#if
11f70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11f80 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
11f90 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
11fa0 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
11fb0 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
11fc0 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
11fd0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
11fe0 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
11ff0 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
12000 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
12010 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52          if( winR
12020 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
12030 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
12040 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12050 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12060 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
12070 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
12080 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d  ite<=(DWORD)nRem
12090 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57   );.      if( nW
120a0 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
120b0 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b  e>(DWORD)nRem ){
120c0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
120d0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
120e0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
120f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
12100 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12110 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  CE.      offset 
12120 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
12130 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
12140 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
12150 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
12160 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
12170 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
12180 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
12190 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
121a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
121b0 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  aRem += nWrite;.
121c0 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57        nRem -= nW
121d0 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rite;.    }.    
121e0 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  if( nRem>0 ){.  
121f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12200 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
12210 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
12220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
12230 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20   rc ){.    if(  
12240 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
12250 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c  rno==ERROR_HANDL
12260 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20  E_DISK_FULL ).  
12270 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d       || ( pFile-
12280 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
12290 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a  R_DISK_FULL )){.
122a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
122b0 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  WRITE file=%p, r
122c0 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
122d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
122e0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
122f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55  gError(SQLITE_FU
12300 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  LL, pFile->lastE
12310 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12330 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c  winWrite1", pFil
12340 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
12350 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
12360 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
12370 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  =SQLITE_IOERR_WR
12380 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ITE\n", pFile->h
12390 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
123a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
123b0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
123c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
123d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123e0 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
123f0 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
12400 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
12410 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
12420 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  try);.  }.  OSTR
12430 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
12440 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
12450 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12460 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12470 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
12480 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
12490 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
124a0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
124b0 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
124c0 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
124d0 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
124e0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e  64 nByte){.  win
124f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
12500 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
12510 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  File handle obje
12520 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
12530 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
12540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12550 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  n code for this 
12560 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57  function */.  DW
12570 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
12580 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
12590 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
125a0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
125b0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
125c0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
125d0 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70  TRUNCATE file=%p
125e0 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63  , size=%lld, loc
125f0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
12600 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42      pFile->h, nB
12610 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  yte, pFile->lock
12620 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  type));..  /* If
12630 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
12640 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
12650 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
12660 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
12670 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
12680 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
12690 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
126a0 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
126b0 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
126c0 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
126d0 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
126e0 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
126f0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
12700 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
12710 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
12720 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
12730 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
12740 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
12750 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
12760 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
12770 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
12780 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c    /* SetEndOfFil
12790 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  e() returns non-
127a0 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73  zero when succes
127b0 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68  sful, or zero wh
127c0 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  en it fails. */.
127d0 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c    if( winSeekFil
127e0 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20  e(pFile, nByte) 
127f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
12800 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12810 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
12820 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
12830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12840 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
12850 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te1", pFile->zPa
12860 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  th);.  }else if(
12870 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69   0==osSetEndOfFi
12880 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a  le(pFile->h) &&.
12890 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61              ((la
128a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
128b0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
128c0 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46  OR_USER_MAPPED_F
128d0 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ILE) ){.    pFil
128e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
128f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
12900 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
12910 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
12920 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
12930 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
12950 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69  nTruncate2", pFi
12960 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
12970 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12980 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
12990 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
129a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
129b0 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
129c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
129d0 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
129e0 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
129f0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
12a00 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
12a10 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20  QLite will.  ** 
12a20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
12a30 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
12a40 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
12a50 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
12a60 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
12a70 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
12a80 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65  n && nByte<pFile
12a90 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
12aa0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
12ab0 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23  e = nByte;.  }.#
12ac0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
12ad0 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
12ae0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
12af0 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
12b00 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
12b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12b20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
12b30 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
12b40 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
12b50 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
12b60 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
12b70 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
12b80 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
12b90 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
12ba0 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
12bb0 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
12bc0 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
12bd0 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
12be0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
12bf0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
12c00 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
12c10 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
12c20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
12c30 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
12c40 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
12c50 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73  ic int winSync(s
12c60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12c70 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66   int flags){.#if
12c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  ndef SQLITE_NO_S
12c90 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  YNC.  /*.  ** Us
12ca0 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c  ed only when SQL
12cb0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
12cc0 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a  ot defined..   *
12cd0 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e  /.  BOOL rc;.#en
12ce0 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
12cf0 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66  (NDEBUG) || !def
12d00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
12d10 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64  YNC) || \.    (d
12d20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
12d30 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
12d40 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20  QLITE_DEBUG)).  
12d50 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65  /*.  ** Used whe
12d60 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
12d70 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
12d80 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72  and by the asser
12d90 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  t() and/or.  ** 
12da0 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73  OSTRACE() macros
12db0 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  ..   */.  winFil
12dc0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
12dd0 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20  ile*)id;.#else. 
12de0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12df0 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  R(id);.#endif.. 
12e00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12e10 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ;.  /* Check tha
12e20 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
12e30 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
12e40 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
12e50 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
12e60 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
12e70 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
12e80 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
12e90 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
12ea0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
12eb0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
12ec0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
12ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
12ee0 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
12ef0 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
12f00 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
12f10 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
12f20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
12f30 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
12f40 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
12f50 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12f60 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41  FULL );..  OSTRA
12f70 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
12f80 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63  p, flags=%x, loc
12f90 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
12fa0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c      pFile->h, fl
12fb0 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ags, pFile->lock
12fc0 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66  type));..#ifndef
12fd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55   SQLITE_TEST.  U
12fe0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12ff0 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20  flags);.#else.  
13000 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29  if( (flags&0x0F)
13010 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
13020 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
13030 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
13040 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
13050 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
13060 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
13070 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
13080 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
13090 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
130a0 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
130b0 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
130c0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
130d0 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  C.  OSTRACE(("SY
130e0 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20  NC-NOP file=%p, 
130f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
13100 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
13110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13120 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73  .#else.  rc = os
13130 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
13140 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69  (pFile->h);.  Si
13150 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
13160 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28  c=FALSE );.  if(
13170 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41   rc ){.    OSTRA
13180 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25  CE(("SYNC file=%
13190 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
131a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
131b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131c0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
131d0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
131e0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
131f0 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52  rror();.    OSTR
13200 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d  ACE(("SYNC file=
13210 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
13220 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46  ERR_FSYNC\n", pF
13230 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13240 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
13250 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
13260 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
13270 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
13290 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  inSync", pFile->
132a0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
132b0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
132c0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
132d0 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
132e0 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
132f0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
13300 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
13310 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
13320 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77  t64 *pSize){.  w
13330 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13340 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
13350 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13360 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
13370 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
13380 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  ( pSize!=0 );.  
13390 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
133a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
133b0 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53  ERR_FSTAT);.  OS
133c0 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
133d0 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e  e=%p, pSize=%p\n
133e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69  ", pFile->h, pSi
133f0 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ze));..#if SQLIT
13400 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
13410 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
13420 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
13430 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
13440 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
13450 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
13460 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
134a0 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
134b0 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
134c0 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
134d0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
134e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
134f0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13500 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
13510 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
13520 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
13530 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
13540 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
13560 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
13570 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
13580 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
13590 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
135a0 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
135b0 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
135c0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
135d0 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
135e0 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
135f0 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
13600 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
13610 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
13620 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
13630 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
13640 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
13650 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
13660 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
13670 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
13680 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13690 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
136a0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
136b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
136c0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
136d0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
136e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
136f0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13700 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13710 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
13720 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
13730 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
13740 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
13750 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
13760 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70  %p, pSize=%p, *p
13770 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73  Size=%lld, rc=%s
13780 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
13790 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c  pFile->h, pSize,
137a0 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33   *pSize, sqlite3
137b0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
137c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
137d0 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
137e0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
137f0 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
13800 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
13810 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
13820 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
13830 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
13840 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
13850 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
13860 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c  endif..#ifndef L
13870 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
13880 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  E_LOCK.# define 
13890 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
138a0 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66  VE_LOCK 2.#endif
138b0 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63  ../*.** Historic
138c0 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73  ally, SQLite has
138d0 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c   used both the L
138e0 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b  ockFile and Lock
138f0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73  FileEx functions
13900 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f  ..** When the Lo
13910 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  ckFile function 
13920 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61 73  was used, it was
13930 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
13940 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65   to fail.** imme
13950 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c  diately if the l
13960 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
13970 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f   obtained.  Also
13980 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70 65  , it always expe
13990 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69  cted to.** obtai
139a0 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  n an exclusive l
139b0 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ock.  These flag
139c0 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 20  s are used with 
139d0 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  the LockFileEx f
139e0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  unction.** and r
139f0 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70  eflect those exp
13a00 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65  ectations; there
13a10 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c  fore, they shoul
13a20 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  d not be changed
13a30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13a40 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
13a50 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
13a60 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
13a70 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  S   (LOCKFILE_FA
13a80 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c  IL_IMMEDIATELY |
13a90 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58       LOCKFILE_EX
13ac0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65  CLUSIVE_LOCK).#e
13ad0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72  ndif../*.** Curr
13ae0 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65  ently, SQLite ne
13af0 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f  ver calls the Lo
13b00 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
13b10 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e  n without wantin
13b20 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  g the.** call to
13b30 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c   fail immediatel
13b40 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  y if the lock ca
13b50 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
13b60 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13b70 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
13b80 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
13b90 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
13ba0 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f  FLAGS (LOCKFILE_
13bb0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
13bc0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13bd0 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
13be0 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
13bf0 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
13c00 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
13c10 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
13c20 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
13c30 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e  is Win9x or WinN
13c40 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
13c50 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
13c60 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
13c70 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53  .  int res;.  OS
13c80 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43  TRACE(("READ-LOC
13c90 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
13ca0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
13cb0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13cc0 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
13cd0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
13ce0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
13cf0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
13d00 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
13d10 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
13d20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
13d30 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
13d40 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
13d50 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
13d60 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
13d70 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
13d80 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
13d90 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
13da0 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
13db0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
13dc0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
13dd0 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
13de0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
13e10 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
13e20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
13e30 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
13e40 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
13e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
13e60 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
13e70 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
13e80 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
13e90 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
13ea0 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
13eb0 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
13ec0 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
13ed0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
13ee0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
13ef0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
13f20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
13f30 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
13f40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
13f50 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
13f60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13f70 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13f80 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
13f90 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
13fa0 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
13fb0 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  /.  }.  OSTRACE(
13fc0 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
13fd0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
13fe0 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
13ff0 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a  ErrName(res)));.
14000 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
14010 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65  ./*.** Undo a re
14020 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63  adlock.*/.static
14030 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65   int winUnlockRe
14040 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
14050 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
14060 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  s;.  DWORD lastE
14070 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28  rrno;.  OSTRACE(
14080 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
14090 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  le=%p, lock=%d\n
140a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
140b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
140c0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
140d0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
140e0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
140f0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
14100 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
14110 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65  E, 0);.  }.#ifde
14120 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
14130 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
14140 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
14150 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14160 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
14170 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
14180 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
14190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
141a0 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61  ( res==0 && ((la
141b0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
141c0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52  astError())!=ERR
141d0 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29  OR_NOT_LOCKED) )
141e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
141f0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
14200 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
14210 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14220 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e  _UNLOCK, pFile->
14230 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14240 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
14250 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20  nlockReadLock", 
14260 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14270 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
14280 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  EAD-UNLOCK file=
14290 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
142a0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
142b0 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20  rrName(res)));. 
142c0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
142d0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
142e0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
142f0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
14300 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
14310 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
14320 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14330 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14340 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14350 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14360 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14370 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14380 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14390 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
143a0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
143b0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
143c0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
143d0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
143e0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
143f0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14400 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14410 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14420 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14430 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14440 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14450 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14460 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14470 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14480 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14490 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
144a0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
144b0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
144c0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
144d0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
144e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
144f0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14500 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14510 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14520 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14530 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14540 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14550 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14560 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14570 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14580 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
14590 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
145a0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
145b0 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
145c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
145d0 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
145e0 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
145f0 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
14600 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
14610 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
14620 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
14630 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
14640 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
14650 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
14660 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
14670 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
14680 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
14690 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
146a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
146b0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
146c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
146d0 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
146e0 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
146f0 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
14700 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
14710 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
14720 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
14730 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
14740 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
14750 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
14760 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
14770 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
14780 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
14790 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
147a0 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
147b0 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
147c0 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
147d0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
147e0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
147f0 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
14800 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
14810 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
14820 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
14830 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "LOCK file=%p, o
14840 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
14850 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
14860 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14870 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
14880 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
14890 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
148a0 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
148b0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
148c0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
148d0 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
148e0 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
148f0 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
14900 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
14910 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
14920 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
14930 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
14940 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
14950 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
14960 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
14970 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
14980 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
14990 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c  TRACE(("LOCK-HEL
149a0 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
149b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
149c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
149d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
149e0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
149f0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
14a00 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
14a10 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
14a20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14a30 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
14a40 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14a50 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
14a60 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
14a70 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
14a80 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
14a90 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
14aa0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
14ab0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
14ac0 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
14ad0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
14ae0 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
14af0 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
14b00 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
14b10 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
14b20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
14b30 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
14b40 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
14b50 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
14b60 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
14b70 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
14b80 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
14b90 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14ba0 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65  ;.  if(   (pFile
14bb0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
14bc0 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20  OCK).     || (  
14bd0 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
14be0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20  USIVE_LOCK).    
14bf0 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e       && (pFile->
14c00 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
14c10 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
14c20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
14c30 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
14c40 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e  >0 && (res = win
14c50 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
14c60 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
14c70 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
14cb0 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
14cc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
14cd0 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
14ce0 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
14cf0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
14d00 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
14d10 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
14d20 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
14d30 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
14d40 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
14d50 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
14d60 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
14d70 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
14d80 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
14d90 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
14da0 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
14db0 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
14dc0 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
14dd0 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
14de0 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
14df0 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
14e00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14e10 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
14e20 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c  PENDING-FAIL fil
14e30 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
14e40 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
14e50 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14e60 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45  h, cnt, sqlite3E
14e70 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20  rrName(res)));. 
14e80 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
14e90 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
14ea0 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
14eb0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
14ec0 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
14ed0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
14ee0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
14ef0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
14f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
14f10 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
14f20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
14f30 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
14f40 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
14f50 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
14f60 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
14f70 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
14f80 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
14f90 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
14fa0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
14fb0 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
14fc0 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
14fd0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
14fe0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
14ff0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
15000 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
15010 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
15020 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
15030 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
15040 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
15050 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
15060 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
15070 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
15080 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
15090 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
150a0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53  KFILE_FLAGS, RES
150b0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
150c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
150d0 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
150e0 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
150f0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
15100 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
15110 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15120 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
15130 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
15140 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
15150 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
15160 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
15170 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
15180 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
15190 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
151a0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
151b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
151c0 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
151d0 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
151e0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
151f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
15200 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
15210 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
15220 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
15230 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  ;.    res = winU
15240 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
15250 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  ile);.    res = 
15260 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
15270 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
15280 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48  CKFILE_FLAGS, SH
15290 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
152c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
152d0 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
152e0 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
152f0 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
15300 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
15310 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15320 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
15330 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
15340 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
15350 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
15360 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
15370 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
15380 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
15390 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
153a0 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
153b0 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
153c0 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
153d0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
153e0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
153f0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
15400 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
15410 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
15420 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
15430 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
15440 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
15450 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
15460 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
15470 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
15480 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
15490 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
154a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
154b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
154c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
154d0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
154e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
154f0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
15500 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25  LOCK-FAIL file=%
15510 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f  p, wanted=%d, go
15520 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
15530 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
15540 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
15550 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70  ktype));.  }.  p
15560 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
15570 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65   (u8)newLocktype
15580 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
15590 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
155a0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
155b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
155c0 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
155d0 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ype, sqlite3ErrN
155e0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
155f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
15610 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
15620 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
15630 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
15640 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
15650 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15660 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15670 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15680 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e  eld, return.** n
15690 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  on-zero, otherwi
156a0 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  se zero..*/.stat
156b0 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52  ic int winCheckR
156c0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
156d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
156e0 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
156f0 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65  nt rc;.  winFile
15700 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
15710 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
15720 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
15730 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15740 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15750 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  K; );.  OSTRACE(
15760 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
15770 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
15780 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
15790 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61   pResOut));..  a
157a0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
157b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
157c0 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
157d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
157e0 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
157f0 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
15800 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c  ile=%p, rc=%d (l
15810 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
15820 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73  >h, rc));.  }els
15830 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  e{.    rc = winL
15840 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15850 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
15860 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52  LEEX_FLAGS,RESER
15870 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
15880 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
15890 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63  {.      winUnloc
158a0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
158b0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
158c0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
158d0 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20      rc = !rc;.  
158e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
158f0 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
15900 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29  , rc=%d (remote)
15910 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
15920 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  c));.  }.  *pRes
15930 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
15940 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
15950 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
15960 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
15970 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
15980 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
15990 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
159a0 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
159b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
159c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
159d0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
159e0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
159f0 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
15a00 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
15a10 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
15a20 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
15a30 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
15a40 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
15a50 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
15a60 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
15a70 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
15a80 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
15a90 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
15aa0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
15ab0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
15ac0 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
15ad0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
15ae0 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
15af0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
15b00 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
15b10 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
15b20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
15b30 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
15b40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
15b50 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
15b60 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
15b70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
15b80 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
15b90 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
15ba0 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
15bb0 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
15bc0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
15bd0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
15be0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
15bf0 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
15c00 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
15c10 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
15c20 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
15c30 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
15c40 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
15c50 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
15c60 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
15c70 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
15c80 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
15c90 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
15ca0 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  pe));.  type = p
15cb0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
15cc0 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
15cd0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
15ce0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
15cf0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
15d00 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
15d10 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
15d20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
15d30 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77  HARED_LOCK && !w
15d40 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  inGetReadLock(pF
15d50 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
15d60 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
15d70 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
15d80 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
15d90 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
15da0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
15db0 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
15dc0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
15dd0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
15de0 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73  UNLOCK, osGetLas
15df0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46   "winUnlock", pF
15e20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
15e30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
15e40 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
15e50 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
15e60 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15e70 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
15e80 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
15e90 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
15ea0 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
15eb0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15ec0 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c    winUnlockReadL
15ed0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  ock(pFile);.  }.
15ee0 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44    if( type>=PEND
15ef0 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
15f00 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
15f10 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
15f20 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
15f30 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
15f40 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63  cktype = (u8)loc
15f50 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
15f60 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  (("UNLOCK file=%
15f70 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25  p, lock=%d, rc=%
15f80 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15f90 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
15fa0 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69  ->locktype, sqli
15fb0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
15fc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15fd0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
15fe0 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20   is inititially 
15ff0 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
16000 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
16010 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
16020 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
16030 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
16040 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
16050 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
16060 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
16070 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
16080 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
16090 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
160a0 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
160b0 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
160c0 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28  void winModeBit(
160d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
160e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
160f0 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
16100 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
16110 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
16120 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
16130 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
16140 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
16150 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
16160 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
16170 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
16180 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
16190 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
161a0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
161b0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
161c0 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
161d0 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
161e0 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63   files */.static
161f0 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
16200 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
16210 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61  *, char **);.sta
16220 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
16230 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a  (const void *);.
16240 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
16250 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
16260 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  olon(const char 
16270 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72  *);../*.** Contr
16280 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20  ol and query of 
16290 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  the open file ha
162a0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
162b0 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  int winFileContr
162c0 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
162d0 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
162e0 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46  d *pArg){.  winF
162f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
16300 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54  nFile*)id;.  OST
16310 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
16320 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72  e=%p, op=%d, pAr
16330 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  g=%p\n", pFile->
16340 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20  h, op, pArg));. 
16350 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
16360 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
16370 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
16380 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
16390 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  Arg = pFile->loc
163a0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54  ktype;.      OST
163b0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
163c0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
163d0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
163e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
163f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
16400 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16410 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
16420 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
16430 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c   = (int)pFile->l
16440 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
16450 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
16460 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16470 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
16480 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
16490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
164a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
164b0 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
164c0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
164d0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
164e0 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
164f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
16500 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
16510 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
16520 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
16530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16540 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16550 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
16560 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20  E_HINT: {.      
16570 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
16580 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  nk>0 ){.        
16590 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c  sqlite3_int64 ol
165a0 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  dSz;.        int
165b0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
165c0 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20  e(id, &oldSz);. 
165d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
165e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
165f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
16600 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71  t64 newSz = *(sq
16610 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72  lite3_int64*)pAr
16620 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  g;.          if(
16630 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a   newSz>oldSz ){.
16640 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
16650 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16660 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(1);.          
16670 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
16680 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20  te(id, newSz);. 
16690 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
166a0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
166b0 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (0);.          }
166c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
166d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
166e0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
166f0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
16700 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
16710 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
16720 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
16730 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16740 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16750 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16760 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16770 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16780 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
16790 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
167a0 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
167b0 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
167c0 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
167d0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
167e0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
167f0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
16800 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16810 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
16820 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
16830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16840 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
16850 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
16860 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
16870 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69  .      winModeBi
16880 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45  t(pFile, WINFILE
16890 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
168a0 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
168b0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
168c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
168d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
168e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
168f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16900 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
16910 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
16920 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
16930 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
16940 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20  intf("win32");. 
16950 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
16960 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
16970 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
16980 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
16990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
169a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
169b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
169c0 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b  IN32_AV_RETRY: {
169d0 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20  .      int *a = 
169e0 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
169f0 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a    if( a[0]>0 ){.
16a00 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
16a10 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
16a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a30 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65     a[0] = winIoe
16a40 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
16a50 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
16a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
16a70 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
16a80 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
16a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
16aa0 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72  ] = winIoerrRetr
16ab0 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a  yDelay;.      }.
16ac0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16ad0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
16ae0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
16af0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
16b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16b10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
16b20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
16b30 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
16b40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
16b50 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
16b60 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
16b70 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
16b80 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
16b90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16bb0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
16bc0 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
16bd0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16be0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
16bf0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
16c00 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
16c10 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
16c20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16c30 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16c40 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
16c50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
16c60 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
16c70 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
16c80 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
16c90 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
16ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
16cb0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
16cc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16cd0 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
16ce0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
16cf0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16d00 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
16d10 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
16d20 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
16d30 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
16d40 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
16d50 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
16d60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
16d70 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
16d80 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
16d90 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
16da0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
16db0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
16dc0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
16dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  {.          (voi
16de0 64 29 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70  d)winUnmapfile(p
16df0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
16e00 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
16e10 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
16e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16e30 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
16e40 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
16e50 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
16e60 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16e70 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
16e80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
16e90 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52  endif.  }.  OSTR
16ea0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
16eb0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  =%p, rc=SQLITE_N
16ec0 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c  OTFOUND\n", pFil
16ed0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
16ee0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
16ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16f00 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
16f10 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
16f20 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
16f30 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
16f40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
16f50 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
16f60 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
16f70 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
16f80 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
16f90 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
16fa0 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
16fb0 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
16fc0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
16fd0 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
16fe0 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
16ff0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
17000 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
17010 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
17020 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
17030 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
17040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
17050 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
17060 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
17070 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
17080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17090 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71  winSectorSize(sq
170a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
170b0 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72  .  (void)id;.  r
170c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
170d0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
170e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
170f0 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65  n a vector of de
17100 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
17110 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tics..*/.static 
17120 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61  int winDeviceCha
17130 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
17140 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
17150 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28    winFile *p = (
17160 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72  winFile*)id;.  r
17170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
17180 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
17190 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20  HEN_OPEN |.     
171a0 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61      ((p->ctrlFla
171b0 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f  gs & WINFILE_PSO
171c0 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  W)?SQLITE_IOCAP_
171d0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
171e0 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ITE:0);.}../* .*
171f0 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f  * Windows will o
17200 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61  nly let you crea
17210 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70  te file view map
17220 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f  pings.** on allo
17230 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e  cation size gran
17240 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69  ularity boundari
17250 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71  es..** During sq
17260 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
17270 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65  we do a GetSyste
17280 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65  mInfo().** to ge
17290 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74  t the granularit
172a0 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45  y size..*/.SYSTE
172b0 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
172c0 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
172d0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
172e0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
172f0 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
17300 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
17310 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
17320 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
17330 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
17340 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
17350 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
17360 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66  ed by .** this f
17370 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
17380 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  h may be shared 
17390 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
173a0 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
173b0 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  ion winShmMutexH
173c0 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
173d0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
173e0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
173f0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
17400 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
17410 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
17420 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
17430 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
17440 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
17450 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
17460 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
17470 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
17480 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
17490 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
174a0 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
174b0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
174c0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
174d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
174e0 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
174f0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
17500 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
17510 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
17520 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
17530 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
17540 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
17550 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
17560 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
17570 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
17580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17590 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
175a0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
175b0 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
175c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
175d0 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
175e0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
175f0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
17600 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
17610 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
17620 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
17630 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
17640 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
17650 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
17660 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
17670 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
17680 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
17690 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
176a0 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
176b0 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
176c0 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
176d0 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
176e0 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
176f0 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
17700 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
17710 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
17720 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
17730 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
17740 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
17750 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
17760 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
17770 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
17780 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
17790 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
177a0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
177b0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
177c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
177d0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
177e0 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
177f0 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
17800 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
17810 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
17820 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
17830 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
17840 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
17850 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
17860 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
17870 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
17880 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
17890 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
178a0 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
178b0 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
178c0 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
178d0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
178e0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
178f0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
17900 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
17910 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
17920 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
17930 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
17940 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
17950 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
17960 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
17970 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17980 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
17990 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
179a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
179b0 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
179c0 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
179d0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
179e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
179f0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
17a00 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
17a10 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
17a20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
17a30 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
17a40 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
17a50 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
17a60 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
17a70 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
17a80 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
17a90 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
17aa0 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
17ab0 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
17ac0 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
17ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
17ae0 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
17af0 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
17b00 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
17b10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
17b20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17b30 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
17b40 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
17b50 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
17b60 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
17b70 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
17b80 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
17b90 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
17ba0 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
17bb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
17bc0 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
17bd0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
17be0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
17bf0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
17c00 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
17c10 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
17c20 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
17c30 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
17c40 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
17c50 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
17c60 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
17c70 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
17c80 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
17c90 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
17ca0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
17cb0 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
17cc0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
17cd0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
17ce0 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
17cf0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
17d00 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
17d10 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
17d20 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
17d30 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
17d40 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
17d50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
17d60 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
17d70 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
17d80 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
17d90 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
17da0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
17db0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
17dc0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
17dd0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
17de0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
17df0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
17e00 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
17e10 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
17e20 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
17e30 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
17e40 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
17e50 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
17e60 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
17e70 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
17e80 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
17e90 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
17ea0 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
17eb0 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
17ec0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
17ed0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
17ee0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
17ef0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
17f00 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
17f30 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
17f40 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
17f50 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
17f60 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
17f70 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
17f80 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
17f90 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
17fa0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
17fb0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
17fc0 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
17fd0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
17fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17ff0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
18000 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
18010 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
18020 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
18030 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
18040 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
18050 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
18060 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
18070 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
18080 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
18090 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
180a0 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
180b0 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
180c0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
180d0 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
180e0 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
180f0 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
18100 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
18110 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
18120 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
18130 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
18140 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
18150 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
18160 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
18170 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
18180 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18190 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
181a0 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
181b0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
181c0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
181d0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
181e0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
181f0 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
18200 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
18210 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
18220 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
18230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
18240 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
18250 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
18260 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
18270 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
18280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18290 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
182a0 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
182b0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
182c0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
182d0 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
182e0 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
182f0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
18300 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
18310 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
18320 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
18330 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
18340 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18350 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
18360 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
18370 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
18380 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65  (("SHM-LOCK file
18390 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66  =%p, lock=%d, of
183a0 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64  fset=%d, size=%d
183b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
183c0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
183d0 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20  lockType, ofst, 
183e0 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52  nByte));..  /* R
183f0 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74  elease/Acquire t
18400 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
18410 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  lock */.  if( lo
18420 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
18430 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  CK ){.    rc = w
18440 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
18450 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66  ile->hFile.h, of
18460 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
18470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18480 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
18490 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
184a0 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ers */.    DWORD
184b0 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
184c0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
184d0 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f  TELY;.    if( lo
184e0 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
184f0 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
18500 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
18510 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
18520 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  c = winLockFile(
18530 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
18540 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20   dwFlags, ofst, 
18550 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
18560 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20  }.  .  if( rc!= 
18570 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
18580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
18590 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
185a0 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c  tErrno =  osGetL
185b0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
185c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
185d0 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
185e0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65  (("SHM-LOCK file
185f0 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72  =%p, func=%s, er
18600 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e  rno=%lu, rc=%s\n
18610 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
18620 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c  ile->hFile.h, (l
18630 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
18640 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c  UNLCK) ? "winUnl
18650 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20  ockFile" :.     
18660 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69        "winLockFi
18670 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  le", pFile->last
18680 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72  Errno, sqlite3Er
18690 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20  rName(rc)));..  
186a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
186b0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
186c0 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f  ces to VFS metho
186d0 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
186e0 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33   winOpen(sqlite3
186f0 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72  _vfs*,const char
18700 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  *,sqlite3_file*,
18710 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69  int,int*);.stati
18720 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
18730 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f  sqlite3_vfs *,co
18740 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
18750 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
18760 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
18770 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
18780 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
18790 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
187a0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
187b0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
187c0 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
187d0 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
187e0 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
187f0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
18800 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
18810 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
18820 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76  mPurge(sqlite3_v
18830 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65  fs *pVfs, int de
18840 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e  leteFlag){.  win
18850 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  ShmNode **pp;.  
18860 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20  winShmNode *p;. 
18870 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
18880 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
18890 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
188a0 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c  RGE pid=%lu, del
188b0 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20  eteFlag=%d\n",. 
188c0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
188d0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
188e0 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b  ), deleteFlag));
188f0 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
18900 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
18910 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
18920 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
18930 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
18940 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
18950 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
18960 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
18970 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
18980 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
18990 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
189a0 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73     BOOL bRc = os
189b0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
189c0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
189d0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
189e0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
189f0 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  -UNMAP pid=%lu, 
18a00 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
18a10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18a20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
18a30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
18a40 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
18a50 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
18a60 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
18a70 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
18a80 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
18a90 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
18aa0 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
18ab0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
18ac0 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53  ("SHM-PURGE-CLOS
18ad0 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
18ae0 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
18b10 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
18b20 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
18b30 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
18b40 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
18b50 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
18b60 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
18b70 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
18b80 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
18b90 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
18ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
18bb0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18bc0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
18bd0 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
18be0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
18bf0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
18c00 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18c10 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
18c20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
18c30 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
18c40 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18c50 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
18c60 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
18c70 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
18c80 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
18c90 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
18ca0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
18cb0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
18cc0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
18cd0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18ce0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
18cf0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
18d00 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
18d10 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
18d20 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
18d30 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18d50 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
18d60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18d70 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
18d80 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
18d90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
18da0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
18db0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
18dc0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
18dd0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
18de0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
18df0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
18e00 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
18e10 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
18e20 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
18e30 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
18e40 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
18e50 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
18e60 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
18e70 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
18e80 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
18e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18ea0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
18eb0 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
18ec0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
18ed0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
18ee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
18ef0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
18f00 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
18f10 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
18f20 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
18f30 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
18f40 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
18f50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
18f80 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
18f90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
18fa0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
18fb0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
18fc0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
18fd0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
19000 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
19010 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
19020 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
19030 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
19040 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
19050 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
19060 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
19070 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
19080 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
19090 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
190a0 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
190b0 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
190c0 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
190d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
190e0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
190f0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
19100 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19110 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
19120 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
19130 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
19140 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
19150 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
19160 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
19170 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
19180 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
19190 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
191a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
191b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
191c0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
191d0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
191e0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
191f0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
19200 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
19210 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
19220 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
19230 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
19240 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
19250 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
19260 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
19270 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
19280 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
19290 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
192a0 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
192b0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
192c0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
192d0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
192e0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
192f0 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
19300 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
19310 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
19320 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
19330 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
19340 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
19350 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
19360 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
19370 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
19380 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
19390 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
193a0 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
193b0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
193c0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
193d0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
193e0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
193f0 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
19400 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
19410 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
19420 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
19430 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
19440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19450 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
19460 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
19470 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
19480 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
19490 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
194a0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
194b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
194c0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
194d0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
194e0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
194f0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
19500 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
19510 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
19520 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
19530 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
19540 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
19550 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19560 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
19570 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
19580 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
19590 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
195a0 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
195b0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
195c0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
195f0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
19610 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
19620 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
19630 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
19640 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
19650 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19660 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
19670 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
19680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19690 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
196a0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
196b0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
196c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
196d0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
196e0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
196f0 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
19700 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
19710 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
19720 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
19730 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
19740 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
19750 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
19760 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
19770 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
19780 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
19790 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
197a0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
197b0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
197c0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
197d0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
197e0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
197f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19810 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
19820 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
19830 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
19840 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
19870 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
19880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
198a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
198b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
198c0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
198d0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
198e0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
198f0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
19900 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
19910 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
19920 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
19930 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
19940 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
19950 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
19960 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
19970 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
19980 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
19990 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
199a0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
199b0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
199c0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
199d0 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
199e0 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
199f0 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
19a00 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
19a10 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
19a20 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
19a30 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
19a40 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
19a50 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
19a60 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
19a70 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
19a80 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
19a90 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
19aa0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
19ab0 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
19ac0 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
19ad0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
19ae0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
19af0 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
19b00 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
19b10 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
19b20 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
19b30 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
19b40 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
19b50 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
19b60 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
19b70 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
19b80 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
19b90 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
19ba0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
19bb0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
19bc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
19bd0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
19be0 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
19bf0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
19c00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19c10 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
19c20 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
19c40 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
19c50 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
19c60 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
19c70 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
19c80 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
19c90 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
19ca0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
19cb0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
19cc0 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
19cd0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
19ce0 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
19cf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
19d00 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
19d10 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
19d20 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
19d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19d40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
19d50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
19d60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
19d70 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
19d80 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
19d90 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
19da0 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
19db0 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
19dc0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
19dd0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
19de0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
19df0 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
19e00 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
19e10 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
19e20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
19e30 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
19e40 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
19e50 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
19e60 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
19e70 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
19e80 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
19e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19ea0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
19eb0 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
19ec0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
19ed0 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
19ee0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
19ef0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
19f00 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
19f10 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
19f20 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
19f30 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
19f40 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
19f50 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
19f60 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
19f70 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
19f80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
19f90 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
19fa0 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
19fb0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
19fc0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
19fd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
19fe0 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
19ff0 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
1a000 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a010 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1a020 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
1a030 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1a040 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
1a050 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
1a060 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
1a070 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
1a080 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
1a090 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1a0a0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
1a0b0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
1a0c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1a0d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1a0e0 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
1a0f0 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
1a100 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
1a110 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
1a120 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
1a130 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
1a140 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1a150 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1a160 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1a170 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
1a180 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
1a190 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1a1a0 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
1a1b0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1a1c0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
1a1d0 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
1a1e0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1a1f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a200 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1a210 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
1a220 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1a230 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
1a240 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
1a250 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
1a260 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1a270 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1a280 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1a290 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1a2a0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a2c0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
1a2d0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1a2e0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
1a310 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
1a320 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1a330 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
1a340 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
1a350 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
1a360 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
1a370 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1a380 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
1a390 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1a3a0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
1a3b0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
1a3c0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1a3d0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1a3e0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
1a3f0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
1a400 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
1a410 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a430 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1a440 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
1a450 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1a460 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1a470 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1a480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1a4b0 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a4e0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
1a4f0 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
1a500 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
1a510 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
1a520 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1a530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
1a540 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1a550 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1a560 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1a570 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1a580 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1a590 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1a5a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1a5b0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
1a5c0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1a5d0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1a5e0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1a5f0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1a600 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1a610 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1a620 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
1a630 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1a640 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1a650 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
1a660 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
1a670 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
1a680 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
1a690 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
1a6a0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
1a6b0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
1a6c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1a6d0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1a6e0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1a6f0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1a700 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
1a710 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
1a720 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1a730 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
1a740 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
1a750 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
1a760 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
1a770 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1a780 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1a790 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1a7a0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
1a7b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1a7c0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
1a7d0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
1a7e0 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
1a7f0 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
1a800 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
1a810 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1a820 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
1a830 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
1a840 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
1a850 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
1a860 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1a870 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1a880 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1a890 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
1a8a0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1a8b0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1a8c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a8d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
1a8e0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
1a8f0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
1a900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a910 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
1a920 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1a930 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1a940 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1a950 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
1a960 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1a970 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1a980 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1a990 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1a9a0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1a9b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1a9c0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1a9d0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1a9e0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1a9f0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1aa00 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1aa10 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1aa20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1aa30 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1aa40 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1aa50 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1aa60 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1aa70 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1aa80 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1aa90 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1aaa0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1aab0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1aac0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1aad0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1aae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1aaf0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1ab00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1ab10 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1ab20 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1ab30 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1ab40 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1ab50 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1ab60 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1ab70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ab80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1ab90 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1aba0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1abb0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1abc0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1abd0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1abe0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1abf0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1ac00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1ac10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ac20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ac30 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1ac40 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1ac50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ac60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1ac70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1ac80 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1ac90 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1aca0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1acb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1acc0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1acd0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1ace0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1acf0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1ad00 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1ad10 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1ad20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1ad30 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1ad40 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1ad50 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1ad60 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1ad70 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1ad80 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1ad90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ada0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1adb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1adc0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1add0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1ade0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1adf0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1ae00 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1ae10 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1ae20 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1ae30 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1ae40 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1ae50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ae60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ae70 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1ae80 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1ae90 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1aea0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1aeb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1aec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aed0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1aee0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1aef0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1af00 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1af10 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1af20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1af30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1af40 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1af50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1af60 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1af70 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1af80 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1af90 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1afa0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1afb0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1afc0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1afd0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1afe0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1aff0 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1b000 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1b010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1b020 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1b030 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1b040 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1b050 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1b060 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1b070 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1b080 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1b090 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1b0a0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1b0b0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1b0c0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1b0d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1b0e0 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
1b0f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1b100 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
1b110 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1b120 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1b130 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
1b140 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1b150 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
1b160 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
1b170 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
1b180 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
1b190 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1b1a0 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
1b1b0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
1b1c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b1d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1b1e0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
1b1f0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
1b200 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
1b210 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1b220 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1b230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b240 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1b250 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
1b260 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
1b270 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
1b280 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
1b290 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
1b2a0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
1b2b0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1b2c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b2d0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1b2e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b2f0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1b300 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1b310 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
1b320 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
1b330 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1b340 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1b350 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1b360 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1b370 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1b380 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1b390 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1b3a0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1b3b0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1b3c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1b3d0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1b3e0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
1b3f0 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1b400 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1b410 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1b420 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1b430 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
1b440 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
1b450 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
1b460 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1b470 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1b480 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1b490 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
1b4a0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
1b4b0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
1b4c0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
1b4d0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
1b4e0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
1b4f0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1b500 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
1b510 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
1b520 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
1b530 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1b540 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
1b550 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
1b560 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1b570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1b580 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
1b590 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1b5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1b5b0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
1b5c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1b5d0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5f0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
1b600 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
1b610 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
1b620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b630 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
1b640 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
1b670 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
1b680 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
1b690 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b6b0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
1b6c0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
1b6d0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1b6e0 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
1b6f0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1b700 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1b710 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1b720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b730 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
1b740 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
1b750 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
1b760 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1b770 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b780 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
1b790 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
1b7a0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1b7b0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
1b7c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b7d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1b7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
1b7f0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
1b800 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
1b810 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
1b820 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
1b830 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1b840 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
1b850 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1b860 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1b870 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
1b880 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
1b890 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
1b8a0 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
1b8b0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
1b8c0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1b8d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1b8e0 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
1b8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1b900 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
1b910 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
1b920 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1b930 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1b940 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
1b950 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
1b960 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
1b970 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1b980 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1b990 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
1b9a0 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
1b9b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
1b9c0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
1b9d0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
1b9e0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1b9f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1ba00 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1ba10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
1ba20 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1ba30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1ba40 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1ba50 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
1ba60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ba70 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1ba80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1ba90 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1baa0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1bad0 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
1bae0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
1baf0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1bb00 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
1bb10 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1bb20 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1bb30 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1bb40 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
1bb50 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
1bb60 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
1bb70 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
1bb80 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
1bb90 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1bba0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
1bbb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
1bbc0 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
1bbd0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1bbe0 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
1bbf0 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
1bc00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1bc10 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1bc20 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
1bc30 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
1bc40 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
1bc50 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
1bc60 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1bc70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1bc80 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
1bc90 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1bca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bcb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1bcc0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1bcd0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1bce0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1bcf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1bd10 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
1bd20 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1bd30 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1bd40 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1bd50 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
1bd60 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1bd70 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
1bd80 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1bd90 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
1bda0 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
1bdb0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
1bdc0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1bdd0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1bde0 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
1bdf0 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
1be00 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
1be10 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
1be20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1be30 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1be40 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1be50 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1be60 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1be70 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1be80 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1be90 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1bea0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1beb0 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1bec0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1bed0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1bee0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1bef0 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1bf00 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1bf10 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1bf20 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45       .#if SQLITE
1bf30 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1bf40 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1bf50 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
1bf60 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
1bf70 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
1bf80 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1bf90 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ITE, nByte, NULL
1bfa0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1bfb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1bfc0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1bfd0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1bfe0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1bff0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1c000 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
1c010 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1c020 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
1c030 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
1c040 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c050 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1c060 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
1c070 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1c080 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
1c090 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
1c0a0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1c0b0 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1c0c0 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1c0d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1c0e0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
1c0f0 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
1c100 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
1c110 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1c120 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1c130 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1c140 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1c150 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
1c170 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1c180 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
1c190 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
1c1a0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1c1b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1c1c0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1c1d0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1c1e0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1c1f0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1c200 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1c210 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
1c220 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
1c230 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1c240 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
1c250 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1c260 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1c270 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1c280 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1c290 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1c2a0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1c2b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
1c2c0 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
1c2d0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1c2e0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1c2f0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1c300 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1c310 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
1c320 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1c330 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1c340 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1c350 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1c360 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1c370 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
1c380 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
1c390 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1c3a0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1c3b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c3c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c3d0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1c3e0 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1c400 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
1c410 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1c420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c430 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
1c440 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1c450 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1c460 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1c470 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1c480 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1c490 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
1c4a0 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
1c4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c4c0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1c4d0 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1c4e0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1c4f0 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1c500 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1c510 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1c520 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1c530 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1c540 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1c550 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1c560 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1c570 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1c580 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1c590 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1c5a0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1c5b0 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1c5c0 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1c5d0 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1c5e0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1c5f0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1c600 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1c610 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1c620 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1c630 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1c640 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1c650 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1c660 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1c670 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1c680 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1c690 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1c6a0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1c6b0 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1c6c0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1c6d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c6e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1c6f0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1c700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1c710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1c720 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1c730 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1c740 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1c750 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1c760 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1c770 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1c780 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1c790 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1c7a0 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1c7b0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1c7c0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1c7d0 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1c7e0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1c7f0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1c800 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1c810 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1c820 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1c830 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1c840 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1c850 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1c860 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1c870 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1c880 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1c890 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1c8a0 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1c8b0 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1c8c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c8d0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1c8e0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1c8f0 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1c900 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1c910 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1c920 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1c930 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1c940 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1c950 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1c960 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1c970 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1c980 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1c990 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1c9a0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1c9b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1c9c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1c9d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1c9e0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1c9f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1ca00 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1ca20 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ca30 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1ca40 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ca50 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1ca60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1ca70 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1ca80 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1ca90 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1caa0 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1cab0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1cae0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
1caf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1cb00 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1cb10 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1cb20 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1cb30 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1cb40 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
1cb50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
1cb60 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
1cb70 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
1cb80 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
1cb90 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1cba0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1cbb0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1cbc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1cbd0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1cbe0 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1cbf0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1cc00 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1cc20 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1cc30 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1cc40 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
1cc50 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1cc60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1cc70 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1cc80 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
1ccb0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1ccc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1ccd0 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1cce0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1ccf0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1cd00 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1cd10 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1cd20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1cd30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1cd40 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
1cd50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cd60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1cd70 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
1cd80 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
1cd90 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1cda0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
1cdb0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
1cdc0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
1cdd0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
1cde0 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
1cdf0 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
1ce00 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
1ce10 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
1ce20 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
1ce30 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
1ce40 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
1ce50 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
1ce60 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
1ce70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1ce80 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
1ce90 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
1cea0 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
1ceb0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
1cec0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
1ced0 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
1cee0 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
1cef0 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
1cf00 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
1cf10 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
1cf20 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1cf30 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
1cf40 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1cf50 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
1cf60 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
1cf70 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
1cf80 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
1cf90 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
1cfa0 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
1cfb0 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
1cfc0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1cfd0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
1cfe0 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
1cff0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d000 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
1d010 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
1d020 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
1d030 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
1d040 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
1d050 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1d060 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
1d070 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
1d080 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1d090 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
1d0a0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1d0b0 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
1d0c0 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
1d0d0 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
1d0e0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
1d0f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
1d100 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
1d110 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
1d120 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1d130 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1d140 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
1d150 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1d160 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d170 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
1d180 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
1d190 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
1d1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d1b0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
1d1c0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
1d1d0 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1d1e0 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
1d1f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1d200 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d210 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1d220 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1d230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1d240 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
1d250 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1d260 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1d270 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
1d280 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d290 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
1d2a0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
1d2b0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
1d2c0 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
1d2d0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
1d2e0 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
1d2f0 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
1d300 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1d310 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20  e - 1);. .  if( 
1d320 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e  nMap==0 && pFd->
1d330 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1d340 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1d350 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Fd);.  }.  if( n
1d360 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
1d370 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ze ){.    void *
1d380 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57  pNew = 0;.    DW
1d390 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41  ORD protect = PA
1d3a0 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  GE_READONLY;.   
1d3b0 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46   DWORD flags = F
1d3c0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20  ILE_MAP_READ;.. 
1d3d0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1d3e0 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70  pFd);.    if( (p
1d3f0 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
1d400 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  WINFILE_RDONLY)=
1d410 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74  =0 ){.      prot
1d420 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57  ect = PAGE_READW
1d430 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67  RITE;.      flag
1d440 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52  s |= FILE_MAP_WR
1d450 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  ITE;.    }.#if S
1d460 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1d470 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1d480 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1d490 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
1d4a0 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1d4b0 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
1d4c0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1d4d0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1d4e0 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
1d4f0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1d500 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
1d510 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d540 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1d550 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1d560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1d590 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1d5a0 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
1d5b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1d5c0 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64  AS_ANSI).    pFd
1d5d0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1d5e0 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46  eFileMappingA(pF
1d5f0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1d600 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
1d630 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
1d640 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
1d670 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
1d680 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  ), NULL);.#endif
1d690 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d  .    if( pFd->hM
1d6a0 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
1d6b0 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1d6c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1d6d0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1d6e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1d6f0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1d700 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1d730 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e1", pFd->zPath)
1d740 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1d750 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1d760 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1d770 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1d780 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1d790 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1d7a0 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
1d7b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d7c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d7d0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d7e0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d7f0 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
1d800 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1d810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d820 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d830 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20  assert( (nMap % 
1d840 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1d850 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20  eSize)==0 );.   
1d860 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1d870 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28  SIZE_T)==sizeof(
1d880 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c  sqlite3_int64) |
1d890 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66  | nMap<=0xffffff
1d8a0 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ff );.#if SQLITE
1d8b0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
1d8c0 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1d8d0 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
1d8e0 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1d8f0 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
1d900 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
1d910 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1d920 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
1d930 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54  s, 0, 0, (SIZE_T
1d940 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20  )nMap);.#endif. 
1d950 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c     if( pNew==NUL
1d960 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  L ){.      osClo
1d970 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d  seHandle(pFd->hM
1d980 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ap);.      pFd->
1d990 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hMap = NULL;.   
1d9a0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1d9b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1d9c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1d9d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1d9e0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1d9f0 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1da20 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le2", pFd->zPath
1da30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1da40 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1da50 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1da60 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1da70 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1da80 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1da90 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d  AP-FILE-MAP pid=
1daa0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1dab0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1dac0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1dad0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1dae0 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1daf0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1db00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1db10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1db20 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
1db30 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  pNew;.    pFd->m
1db40 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
1db50 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1db60 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a  eActual = nMap;.
1db70 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1db80 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1db90 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1dba0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1dbb0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1dbc0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1dbd0 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72  , pFd));.  retur
1dbe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1dbf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1dc00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
1dc10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
1dc20 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
1dc30 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
1dc40 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
1dc50 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
1dc60 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
1dc70 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
1dc80 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
1dc90 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
1dca0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
1dcb0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
1dcc0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
1dcd0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
1dce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1dcf0 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
1dd00 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
1dd10 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
1dd20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
1dd30 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
1dd40 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
1dd50 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
1dd60 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1dd70 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
1dd80 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
1dd90 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
1dda0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1ddb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
1ddc0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
1ddd0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
1dde0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1ddf0 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
1de00 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
1de10 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
1de20 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
1de30 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
1de40 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1de50 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
1de60 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
1de70 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
1de80 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1de90 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
1dea0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1deb0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1dec0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1ded0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
1dee0 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
1def0 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
1df00 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
1df10 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
1df20 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
1df30 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1df40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1df50 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
1df60 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
1df70 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1df80 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
1df90 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
1dfa0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
1dfb0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
1dfc0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
1dfd0 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
1dfe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1dff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e000 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e010 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1e020 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1e030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e040 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1e050 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1e060 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1e070 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
1e080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e090 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1e0a0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
1e0b0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
1e0c0 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
1e0d0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
1e0e0 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
1e0f0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
1e100 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
1e110 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
1e120 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
1e130 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
1e140 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
1e150 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1e160 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e170 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
1e180 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
1e190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e1a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1e1b0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
1e1c0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
1e1d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1e1e0 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
1e1f0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
1e200 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
1e210 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68  call to winFetch
1e220 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
1e230 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
1e240 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1e250 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
1e260 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
1e270 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
1e280 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
1e290 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46  ssed to the winF
1e2a0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
1e2b0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
1e2c0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
1e2d0 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
1e2e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1e2f0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
1e300 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
1e310 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
1e320 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
1e330 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
1e340 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
1e350 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
1e360 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
1e370 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
1e380 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74  tic int winUnfet
1e390 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1e3a0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76  *fd, i64 iOff, v
1e3b0 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  oid *p){.#if SQL
1e3c0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e3d0 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
1e3e0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1e3f0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
1e400 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
1e410 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  file */..  /* If
1e420 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
1e430 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
1e440 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1e450 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1e460 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
1e470 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
1e480 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
1e490 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
1e4a0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
1e4b0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
1e4c0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
1e4d0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
1e4e0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
1e4f0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
1e500 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
1e510 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
1e520 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
1e530 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
1e540 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
1e550 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
1e560 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
1e570 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
1e580 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1e590 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
1e5a0 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
1e5b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e5c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e5d0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
1e5e0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
1e5f0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
1e600 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
1e610 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
1e620 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
1e630 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
1e640 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
1e650 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
1e660 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
1e670 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
1e680 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
1e690 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
1e6a0 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
1e6b0 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20  cessary can can 
1e6c0 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74  be omitted - pot
1e6d0 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69  entially improvi
1e6e0 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72  ng.    ** perfor
1e6f0 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77  mance.  */.    w
1e700 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
1e710 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1e720 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
1e730 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
1e740 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
1e750 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1e760 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1e770 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1e780 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1e790 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a  cessId(), fd));.
1e7a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e7b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
1e7c0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
1e7d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
1e7e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
1e7f0 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
1e800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e810 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
1e820 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
1e830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e840 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1e850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e890 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1e8a0 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
1e8b0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
1e8c0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
1e8d0 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
1e8e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
1e8f0 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
1e900 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1e910 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
1e920 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20  ethod = {.  3,  
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1e950 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
1e960 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e980 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
1e990 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e9b0 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
1e9c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1e9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
1e9e0 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
1e9f0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1ea00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
1ea10 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
1ea20 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1ea30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1ea40 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
1ea50 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1ea60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1ea70 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
1ea80 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ea90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1eaa0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
1eab0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1eac0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1ead0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
1eae0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
1eaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
1eb00 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1eb10 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
1eb20 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
1eb30 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1eb40 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
1eb50 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
1eb60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1eb70 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
1eb80 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1eb90 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
1eba0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1ebb0 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
1ebc0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ebe0 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
1ebf0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ec10 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
1ec20 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec40 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
1ec50 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20   winShmUnmap,   
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
1ec80 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20  .  winFetch,    
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
1ecb0 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20    winUnfetch    
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
1ece0 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
1ecf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed30 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1ed40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1ed50 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
1ed60 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1ed70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
1ed90 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
1eda0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1edb0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
1edc0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
1edd0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69  s object..*/..#i
1ede0 66 20 30 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  f 0./*.** Conver
1edf0 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f  t a filename fro
1ee00 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20 75  m whatever the u
1ee10 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
1ee20 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75  ing system.** su
1ee30 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e  pports for filen
1ee40 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e  ames into UTF-8.
1ee50 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1ee60 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a  the result is.**
1ee70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
1ee80 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
1ee90 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
1eea0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
1eeb0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1eec0 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66  *winConvertToUtf
1eed0 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
1eee0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  void *zFilename)
1eef0 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65  {.  char *zConve
1ef00 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
1ef10 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
1ef20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
1ef30 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46  UnicodeToUtf8(zF
1ef40 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
1ef50 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
1ef60 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
1ef70 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
1ef80 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
1ef90 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
1efa0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
1efb0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
1efc0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
1efd0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
1efe0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
1eff0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
1f000 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
1f010 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
1f020 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
1f030 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1f040 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
1f050 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
1f060 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
1f070 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
1f080 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
1f090 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
1f0a0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
1f0b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
1f0c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1f0d0 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
1f0e0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
1f0f0 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
1f100 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
1f110 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
1f120 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
1f130 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
1f140 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
1f150 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
1f160 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
1f170 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1f180 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1f190 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
1f1a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
1f1b0 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e  8_to_mbcs(zFilen
1f1c0 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ame);.  }.#endif
1f1d0 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
1f1e0 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
1f1f0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
1f200 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
1f210 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f220 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
1f230 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
1f240 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73 74  ecified UTF-8 st
1f250 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65  ring buffer.** e
1f260 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65 63  nds with a direc
1f270 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
1f280 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
1f290 74 69 63 20 69 6e 74 20 77 69 6e 45 6e 64 73 49  tic int winEndsI
1f2a0 6e 44 69 72 53 65 70 28 63 68 61 72 20 2a 7a 42  nDirSep(char *zB
1f2b0 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20  uf){.  if( zBuf 
1f2c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20  ){.    int nLen 
1f2d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f2e0 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 72 65 74  0(zBuf);.    ret
1f2f0 75 72 6e 20 6e 4c 65 6e 3e 30 20 26 26 20 77 69  urn nLen>0 && wi
1f300 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e  nIsDirSep(zBuf[n
1f310 4c 65 6e 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20 72  Len-1]);.  }.  r
1f320 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f330 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
1f340 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61  rary file name a
1f350 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1f360 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69  ulting pointer i
1f370 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68  nto pzBuf..** Th
1f380 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
1f390 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74  ed in pzBuf must
1f3a0 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73 71   be freed via sq
1f3b0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
1f3c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
1f3d0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
1f3e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68  e3_vfs *pVfs, ch
1f3f0 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73  ar **pzBuf){.  s
1f400 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
1f410 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
1f420 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
1f430 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
1f440 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
1f450 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
1f460 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
1f470 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
1f480 42 75 66 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Buf, nLen;.  cha
1f490 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
1f4a0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1f4b0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1f4c0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1f4d0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1f4e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1f4f0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1f500 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1f510 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1f520 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1f530 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
1f540 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1f550 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1f560 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
1f570 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
1f580 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
1f590 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
1f5a0 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
1f5b0 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  .  ** name for t
1f5c0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
1f5d0 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  e.  If this fail
1f5e0 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  s, we cannot con
1f5f0 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 42  tinue..  */.  nB
1f600 75 66 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  uf = pVfs->mxPat
1f610 68 6e 61 6d 65 3b 0a 20 20 7a 42 75 66 20 3d 20  hname;.  zBuf = 
1f620 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1f630 6f 28 20 6e 42 75 66 2b 32 20 29 3b 0a 20 20 69  o( nBuf+2 );.  i
1f640 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20  f( !zBuf ){.    
1f650 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
1f660 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
1f670 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
1f680 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
1f690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1f6a0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  M;.  }..  /* Fig
1f6b0 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65  ure out the effe
1f6c0 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20  ctive temporary 
1f6d0 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73  directory.  Firs
1f6e0 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a  t, check if one.
1f6f0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78    ** has been ex
1f700 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20  plicitly set by 
1f710 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b  the application;
1f720 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   otherwise, use 
1f730 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e  the one.  ** con
1f740 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f  figured by the o
1f750 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e  perating system.
1f760 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f770 6e 42 75 66 3e 33 30 20 29 3b 0a 20 20 69 66 28  nBuf>30 );.  if(
1f780 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
1f790 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
1f7a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1f7b0 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22  nBuf-30, zBuf, "
1f7c0 25 73 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74  %s%s", sqlite3_t
1f7d0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 0a 20  emp_directory,. 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 20 77 69 6e 45 6e 64 73 49 6e 44 69 72      winEndsInDir
1f800 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  Sep(sqlite3_temp
1f810 5f 64 69 72 65 63 74 6f 72 79 29 20 3f 20 22 22  _directory) ? ""
1f820 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
1f830 20 20 20 20 20 20 20 20 77 69 6e 47 65 74 44 69          winGetDi
1f840 72 44 65 70 28 29 29 3b 0a 20 20 7d 0a 23 69 66  rDep());.  }.#if
1f850 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
1f860 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20  N__).  else{.   
1f870 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1f880 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
1f890 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
1f8a0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
1f8b0 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
1f8c0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
1f8d0 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
1f8e0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
1f8f0 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
1f900 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d  , /* getenv("TEM
1f910 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
1f920 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52   /* getenv("USER
1f930 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20  PROFILE") */.   
1f940 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
1f950 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70         "/usr/tmp
1f960 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22  ",.       "/tmp"
1f970 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20  ,.       ".",.  
1f980 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
1f990 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
1f9a0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
1f9b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
1f9c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1f9d0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Dir = 0;..    if
1f9e0 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
1f9f0 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
1fa00 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
1fa10 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
1fa20 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
1fa30 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
1fa40 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
1fa50 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69  azDirs[2] ) azDi
1fa60 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[2] = getenv("
1fa70 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  TMP");.    if( !
1fa80 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69  azDirs[3] ) azDi
1fa90 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[3] = getenv("
1faa0 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  TEMP");.    if( 
1fab0 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44  !azDirs[4] ) azD
1fac0 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28  irs[4] = getenv(
1fad0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
1fae0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1faf0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
1fb00 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
1fb10 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
1fb20 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ]){.      void *
1fb30 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
1fb40 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
1fb50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1fb60 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73  /* If the path s
1fb70 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
1fb80 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77  ve letter follow
1fb90 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a  ed by the colon.
1fba0 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74        ** charact
1fbb0 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73  er, assume it is
1fbc0 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76   already a nativ
1fbd0 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74  e Win32 path; ot
1fbe0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
1fbf0 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e  * it must be con
1fc00 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69  verted to a nati
1fc10 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 70 72  ve Win32 path pr
1fc20 69 6f 72 20 76 69 61 20 74 68 65 20 43 79 67 77  ior via the Cygw
1fc30 69 6e 0a 20 20 20 20 20 20 2a 2a 20 41 50 49 20  in.      ** API 
1fc40 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69  prior to using i
1fc50 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1fc60 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65    if( winIsDrive
1fc70 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
1fc80 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dir) ){.        
1fc90 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
1fca0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
1fcb0 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20  ilename(zDir);. 
1fcc0 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
1fcd0 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
1fce0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
1fcf0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
1fd00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1fd10 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
1fd20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd30 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1fd40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1fd50 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
1fd60 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
1fd70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1fd80 72 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a  rintf(nBuf-30, z
1fd90 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29  Buf, "%s", zDir)
1fda0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1fdb0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1fdc0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
1fdd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1fde0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fdf0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1fe00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1fe10 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
1fe20 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ed = sqlite3Mall
1fe30 6f 63 5a 65 72 6f 28 20 6e 42 75 66 2b 31 20 29  ocZero( nBuf+1 )
1fe40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
1fe50 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
1fe60 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1fe70 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
1fe80 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
1fe90 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
1fea0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1feb0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1fec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fed0 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
1fee0 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
1fef0 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29          osIsNT()
1ff00 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
1ff10 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
1ff20 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72  X_TO_WIN_A, zDir
1ff30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ff40 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42    zConverted, nB
1ff50 75 66 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  uf+1)<0 ){.     
1ff60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ff70 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1ff80 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
1ff90 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
1ffa0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1ffb0 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a  _CONVPATH\n"));.
1ffc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ffd0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ffe0 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
1fff0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
20000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20020 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22  winGetTempname1"
20030 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  , zDir);.       
20040 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
20050 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
20060 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
20070 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
20080 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63  t, we know the c
20090 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f  andidate directo
200a0 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73 68  ry exists and sh
200b0 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ould.          *
200c0 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65  * be used.  Howe
200d0 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64  ver, we may need
200e0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
200f0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
20100 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  g.          ** i
20110 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46  ts name into UTF
20120 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69  -8 (i.e. if it i
20130 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e  s UTF-16 right n
20140 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ow)..          *
20150 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
20160 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
20170 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55          char *zU
20180 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  tf8 = winUnicode
20190 54 6f 55 74 66 38 28 7a 43 6f 6e 76 65 72 74 65  ToUtf8(zConverte
201a0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
201b0 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
201c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
201d0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
201e0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
201f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
20200 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
20210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
20220 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
20230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20240 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
20250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20270 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
20280 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  -30, zBuf, "%s",
20290 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20   zUtf8);.       
202a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
202b0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
202c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
202d0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
202e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
202f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
20300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
20310 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
20320 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20  (nBuf-30, zBuf, 
20330 22 25 73 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  "%s", zConverted
20340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
20350 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
20360 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
20370 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20390 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
203a0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
203b0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
203c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
203d0 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45   }.#elif !SQLITE
203e0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
203f0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
20400 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49  ).  else if( osI
20410 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
20420 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c  r *zMulti;.    L
20430 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20  PWSTR zWidePath 
20440 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
20450 65 72 6f 28 20 6e 42 75 66 2a 73 69 7a 65 6f 66  ero( nBuf*sizeof
20460 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69  (WCHAR) );.    i
20470 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b  f( !zWidePath ){
20480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20490 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
204a0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
204b0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
204c0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
204d0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
204e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
204f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
20500 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
20510 68 57 28 6e 42 75 66 2c 20 7a 57 69 64 65 50 61  hW(nBuf, zWidePa
20520 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
20530 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
20540 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73  dePath);.      s
20550 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
20560 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
20570 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
20580 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
20590 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
205a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
205b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
205c0 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
205d0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
205e0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
20610 31 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  1", 0);.    }.  
20620 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e    zMulti = winUn
20630 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
20640 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
20650 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
20660 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
20670 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20  (nBuf-30, zBuf, 
20680 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
20690 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
206a0 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  e(zMulti);.     
206b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
206c0 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65  idePath);.    }e
206d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
206e0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
206f0 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
20700 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
20710 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
20720 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
20730 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
20740 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
20750 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
20760 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
20770 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20780 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
20790 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
207a0 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61   *zUtf8;.    cha
207b0 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73  r *zMbcsPath = s
207c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
207d0 28 20 6e 42 75 66 20 29 3b 0a 20 20 20 20 69 66  ( nBuf );.    if
207e0 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a  ( !zMbcsPath ){.
207f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20800 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(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 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
20840 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
20850 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
20860 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
20870 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
20880 41 28 6e 42 75 66 2c 20 7a 4d 62 63 73 50 61 74  A(nBuf, zMbcsPat
20890 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
208a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
208b0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
208c0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
208d0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
208e0 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
208f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20910 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
20920 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
20930 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
20960 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  2", 0);.    }.  
20970 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
20980 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
20990 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
209a0 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
209b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
209c0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33 30  snprintf(nBuf-30
209d0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
209e0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
209f0 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
20a00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20a20 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
20a30 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
20a40 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
20a50 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
20a60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20a70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
20a80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
20a90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
20aa0 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65  2_HAS_ANSI */.#e
20ab0 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
20ac0 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f  OS_WINRT */..  /
20ad0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
20ae0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
20af0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
20b00 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
20b10 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
20b20 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
20b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
20b40 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e  ROR..  */.  nLen
20b50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
20b60 33 30 28 7a 42 75 66 29 3b 0a 0a 20 20 69 66 28  30(zBuf);..  if(
20b70 20 28 6e 4c 65 6e 20 2b 20 73 71 6c 69 74 65 33   (nLen + sqlite3
20b80 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f  Strlen30(SQLITE_
20b90 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
20ba0 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20  ) + 18) >= nBuf 
20bb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
20bc0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
20bd0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
20be0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
20bf0 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
20c00 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
20c10 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
20c20 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
20c30 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 7d 0a  name3", 0);.  }.
20c40 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
20c50 6e 74 66 28 6e 42 75 66 2d 31 38 2d 6e 4c 65 6e  ntf(nBuf-18-nLen
20c60 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c  , zBuf+nLen, SQL
20c70 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
20c80 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71  EFIX);..  j = sq
20c90 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
20ca0 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
20cb0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
20cc0 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
20cd0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
20ce0 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
20cf0 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
20d00 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
20d10 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
20d20 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
20d30 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
20d40 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
20d50 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a   0;.  *pzBuf = z
20d60 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  Buf;..  OSTRACE(
20d70 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
20d80 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
20d90 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29  TE_OK\n", zBuf))
20da0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20db0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
20dc0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
20dd0 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
20de0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
20df0 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
20e00 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
20e10 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
20e20 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
20e30 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
20e40 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
20e50 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
20e60 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
20e70 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
20e80 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
20e90 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
20ea0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
20eb0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
20ec0 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f  tErrno;..  if( o
20ed0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
20ee0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
20ef0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
20f00 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
20f10 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
20f20 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
20f30 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
20f40 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
20f50 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
20f60 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
20f70 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
20f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
20fa0 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
20fb0 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
20fe0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
20ff0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
21000 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
21010 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
21020 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
21030 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
21040 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
21050 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
21060 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
21070 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
21080 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
21090 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
210a0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
210b0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
210c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
210d0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
210e0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
210f0 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
21100 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
21110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
21120 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
21130 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
21140 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
21150 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73  fs,        /* Us
21160 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75  ed to get maximu
21170 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67  m path name leng
21180 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  th */.  const ch
21190 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
211a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
211b0 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
211c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
211d0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *id,         /* 
211e0 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65  Write the SQLite
211f0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   file handle her
21200 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
21210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21220 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
21230 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
21240 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
21250 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74     /* Status ret
21260 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  urn flags */.){.
21270 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57    HANDLE h;.  DW
21280 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
21290 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
212a0 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
212b0 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
212c0 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
212d0 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
212e0 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
212f0 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
21300 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
21310 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
21320 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
21330 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
21340 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
21350 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21370 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
21380 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
21390 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
213a0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46  me = zName; /* F
213b0 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
213c0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
213d0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  nt cnt = 0;..  /
213e0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
213f0 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
21400 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
21410 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
21420 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
21430 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
21440 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
21450 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
21460 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
21470 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65    char *zTmpname
21480 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d   = 0; /* For tem
21490 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c  porary filename,
214a0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a   if necessary. *
214b0 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
214c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
214d0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
214e0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
214f0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
21500 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
21510 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
21520 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
21530 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
21540 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
21550 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
21560 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
21570 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
21580 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
21590 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
215a0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
215b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
215c0 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
215d0 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
215e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
215f0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
21600 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
21610 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
21620 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
21630 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
21640 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
21650 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21660 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
21670 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
21680 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
21690 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
216a0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
216b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
216c0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
216d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
216e0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
216f0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
21700 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
21710 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
21720 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
21730 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
21740 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
21750 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
21760 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
21770 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
21780 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
21790 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
217a0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
217b0 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
217c0 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
217d0 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
217e0 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
217f0 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
21800 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
21810 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
21820 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
21830 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
21840 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
21850 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
21860 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
21870 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
21880 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
21890 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
218a0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
218b0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
218c0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
218d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
218e0 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
218f0 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
21900 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
21910 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
21920 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
21930 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
21940 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
21950 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
21960 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
21970 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
21980 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
21990 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
219a0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
219b0 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
219c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
219d0 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
219e0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
219f0 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
21a00 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
21a10 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
21a20 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
21a30 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
21a40 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
21a50 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
21a60 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
21a70 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
21a80 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
21a90 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
21aa0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
21ab0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
21ac0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
21ad0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
21ae0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
21af0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
21b00 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
21b10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
21b20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
21b30 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
21b40 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
21b50 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
21b60 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
21b70 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
21b80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21b90 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
21ba0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
21bb0 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
21bc0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
21bd0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
21be0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
21bf0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
21c00 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
21c10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
21c20 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
21c30 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
21c40 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
21c50 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
21c60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
21c70 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
21c80 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
21c90 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
21ca0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
21cb0 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  0 );.  memset(pF
21cc0 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ile, 0, sizeof(w
21cd0 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c  inFile));.  pFil
21ce0 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
21cf0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69  ANDLE_VALUE;..#i
21d00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
21d10 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  T.  if( !zUtf8Na
21d20 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74  me && !sqlite3_t
21d30 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
21d40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
21d50 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20  (SQLITE_ERROR,. 
21d60 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f         "sqlite3_
21d70 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76  temp_directory v
21d80 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  ariable should b
21d90 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22  e set for WinRT"
21da0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
21db0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
21dc0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21dd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
21de0 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
21df0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
21e00 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
21e10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
21e20 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
21e30 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
21e40 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
21e50 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
21e60 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
21e70 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
21e80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
21ea0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
21eb0 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
21ec0 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
21ed0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
21ee0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21ef0 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
21f00 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
21f10 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
21f20 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
21f30 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
21f40 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
21f50 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
21f60 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
21f70 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
21f80 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
21f90 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
21fa0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
21fb0 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
21fc0 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
21fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21fe0 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
21ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
22000 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
22010 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
22020 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
22030 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
22040 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
22050 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
22060 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
22070 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
22080 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
22090 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
220a0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
220b0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
220c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
220d0 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
220e0 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
220f0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
22100 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
22110 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
22120 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22130 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
22140 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
22150 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
22160 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
22170 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
22180 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
22190 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
221a0 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
221b0 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
221c0 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
221d0 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
221e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
221f0 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
22200 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
22210 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
22220 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
22230 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
22240 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
22250 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
22260 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
22270 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
22280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
22290 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
222a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
222b0 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20  a new file is . 
222c0 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c   ** created. SQL
222d0 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  ite doesn't use 
222e0 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22  it to indicate "
222f0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
22300 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  " .  ** as it is
22310 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
22320 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
22330 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
22340 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
22350 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
22360 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
22370 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
22380 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
22390 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
223a0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
223b0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
223c0 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
223d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
223e0 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
223f0 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
22400 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
22410 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
22420 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
22430 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
22440 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
22450 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
22460 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
22470 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
22480 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
22490 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
224a0 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
224b0 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
224c0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
224d0 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
224e0 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
224f0 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
22500 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
22510 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
22520 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
22530 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
22540 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
22550 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
22560 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
22570 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
22580 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
225b0 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
225e0 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
225f0 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
22600 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
22610 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
22620 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
22630 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
22640 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
22650 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
22660 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
22670 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
22680 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
22690 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
226a0 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
226b0 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
226c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
226d0 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
226e0 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
226f0 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
22700 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
22710 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
22720 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
22730 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
22740 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
22750 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
22760 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
22770 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
22780 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
22790 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
227a0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
227b0 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
227c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
227d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
227e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
227f0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
22800 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
22810 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
22820 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
22830 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
22840 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
22850 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
22860 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
22870 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
22880 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
22890 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
228a0 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
228b0 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
228c0 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
228d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
228e0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
228f0 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
22900 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
22910 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
22920 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
22930 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
22960 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
22990 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
229c0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
229f0 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
22a00 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
22a10 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
22a40 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
22a50 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
22a60 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
22a70 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
22a80 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
22a90 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
22aa0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
22ad0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
22b00 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
22b30 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
22b40 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
22b70 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b90 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
22ba0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
22bb0 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
22be0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
22bf0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
22c00 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
22c10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
22c20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
22c30 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
22c40 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
22c50 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
22c60 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
22c70 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
22ca0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
22cd0 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
22d00 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
22d30 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
22d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
22d70 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
22da0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
22db0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
22dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22dd0 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
22de0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
22df0 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
22e00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
22e10 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
22e20 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
22e30 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
22e40 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
22e50 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
22e60 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
22e70 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
22e80 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
22e90 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
22ea0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
22eb0 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
22ec0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
22ed0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
22ee0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
22ef0 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
22f00 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
22f10 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
22f20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22f30 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22f40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22f50 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
22f60 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
22f70 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
22f80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
22f90 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
22fa0 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
22fb0 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
22fc0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20  _OPEN_READONLY) 
22fd0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
22fe0 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f         ~(SQLITE_
22ff0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
23000 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23010 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f  E)),.         pO
23020 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
23030 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
23040 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
23050 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
23060 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  }..  if( pOutFla
23070 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gs ){.    if( is
23080 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
23090 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
230a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
230b0 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
230c0 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
230d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
230e0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
230f0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
23100 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
23110 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
23120 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  %lx, pOutFlags=%
23130 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64  p, *pOutFlags=%d
23140 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
23150 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
23160 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65  f8Name, dwDesire
23170 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61  dAccess, pOutFla
23180 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a  gs, pOutFlags ?.
23190 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74             *pOut
231a0 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49  Flags : 0, (h==I
231b0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
231c0 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
231d0 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53  : "ok"));..#if S
231e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
231f0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
23200 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
23210 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
23220 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77        && (rc = w
23230 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
23240 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53  Name, pFile))!=S
23250 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
23260 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
23270 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
23280 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
23290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
232a0 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
232b0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
232c0 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73  -CE-LOCK name=%s
232d0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d  , rc=%s\n", zNam
232e0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
232f0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74  e(rc)));.    ret
23300 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
23310 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
23320 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
23330 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
23340 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
23350 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
23360 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
23370 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
23380 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
23390 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 2d 3e 70  .  }..  pFile->p
233a0 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d  Method = &winIoM
233b0 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e  ethod;.  pFile->
233c0 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
233d0 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69  File->h = h;.  i
233e0 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b  f( isReadonly ){
233f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
23400 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
23410 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  _RDONLY;.  }.  i
23420 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
23430 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70  oolean(zName, "p
23440 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
23450 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
23460 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
23470 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
23480 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
23490 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
234a0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  o = NO_ERROR;.  
234b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a  pFile->zPath = z
234c0 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45  Name;.#if SQLITE
234d0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
234e0 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d  .  pFile->hMap =
234f0 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e   NULL;.  pFile->
23500 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
23510 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
23520 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  e = 0;.  pFile->
23530 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
23540 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
23550 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
23560 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
23570 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20  zMmap;.#endif.. 
23580 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
23590 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
235a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
235b0 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
235c0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57  *.** Note that W
235d0 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
235e0 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
235f0 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
23600 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
23610 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
23620 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
23630 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
23640 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
23650 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
23660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
23670 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
23680 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
23690 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
236a0 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69  er it does.  Whi
236b0 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72  le this other pr
236c0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
236d0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   the.** file ope
236e0 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  n, we will be un
236f0 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69  able to delete i
23700 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  t.  To work arou
23710 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c  nd this.** probl
23720 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30  em, we delay 100
23730 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
23740 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  d try to delete 
23750 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f  again.  Up.** to
23760 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
23770 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61  EMPTs deletion a
23780 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20  ttempts are run 
23790 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a  before giving.**
237a0 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
237b0 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  g an error..*/.s
237c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
237d0 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
237e0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
237f0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
23800 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
23810 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
23820 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
23830 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
23840 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
23850 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
23860 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
23870 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
23880 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
23890 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
238a0 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61  attr;.  DWORD la
238b0 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20  stErrno;.  void 
238c0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
238d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
238e0 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
238f0 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
23900 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
23910 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
23920 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
23930 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
23940 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
23950 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a  syncDir=%d\n", z
23960 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69  Filename, syncDi
23970 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  r));..  zConvert
23980 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
23990 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
239a0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
239b0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
239c0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
239d0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
239e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
239f0 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
23a00 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
23a10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23a20 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
23a30 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
23a40 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
23a50 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
23a60 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
23a70 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
23a80 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
23a90 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
23aa0 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
23ab0 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
23ac0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
23ad0 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
23ae0 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
23af0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
23b20 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
23b30 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
23b40 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
23b50 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
23b60 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
23b70 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
23b80 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
23b90 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
23ba0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
23bb0 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
23bc0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
23bd0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
23be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23bf0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
23c00 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
23c10 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
23c20 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
23c30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23c40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
23c70 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
23c80 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
23c90 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
23ca0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
23cb0 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
23cc0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
23cd0 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
23ce0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
23cf0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
23d00 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
23d10 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
23d20 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
23d30 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
23d40 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
23d50 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
23d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
23d70 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
23d80 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
23d90 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
23da0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
23db0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
23dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23dd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23de0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
23df0 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
23e00 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
23e10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23e20 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
23e30 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
23e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23e50 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
23e60 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
23e70 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
23e80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23e90 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
23ea0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
23eb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
23ec0 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
23ed0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
23ee0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
23ef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
23f00 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
23f10 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
23f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23f30 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
23f40 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
23f50 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
23f60 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
23f70 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
23f80 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
23f90 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
23fa0 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
23fb0 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
23fc0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
23fd0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
23fe0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
23ff0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
24000 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
24010 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
24020 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
24030 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
24040 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
24050 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24060 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
24070 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
24080 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
24090 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
240a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
240b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
240c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
240d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
240e0 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
240f0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
24100 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
24110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
24120 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
24130 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
24140 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
24150 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
24160 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
24170 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
24180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
24190 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
241a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
241b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
241c0 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
241d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
241e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
241f0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
24200 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
24210 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
24220 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
24230 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
24240 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
24250 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  c && rc!=SQLITE_
24260 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
24270 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  NT ){.    rc = w
24280 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
24290 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
242a0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44  lastErrno, "winD
242b0 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
242c0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
242d0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
242e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
242f0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24300 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
24310 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
24320 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
24330 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
24340 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
24350 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24360 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
24370 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
24380 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
24390 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
243a0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
243b0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
243c0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
243d0 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
243e0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
243f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24400 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
24410 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24430 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
24440 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
24450 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
24460 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
24470 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
24480 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
24490 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
244a0 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
244b0 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a  Errno;.  void *z
244c0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
244d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
244e0 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
244f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
24500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
24510 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  ESS; );.  OSTRAC
24520 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
24530 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52  %s, flags=%x, pR
24540 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20  esOut=%p\n",.   
24550 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
24560 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  e, flags, pResOu
24570 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  t));..  zConvert
24580 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
24590 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
245a0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
245b0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
245c0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
245d0 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
245e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
245f0 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
24600 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
24610 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24620 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
24630 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
24640 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
24650 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
24660 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
24670 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
24680 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
24690 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
246a0 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
246b0 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
246c0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
246d0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
246e0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
24710 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20  ndard, .        
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
24740 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
24750 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
24760 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
24770 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
24780 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
24790 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
247a0 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
247b0 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
247c0 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
247d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
247e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
247f0 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
24800 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
24810 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
24820 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
24830 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20  High==0 .       
24840 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
24850 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
24860 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
24870 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
24880 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
24890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
248a0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
248b0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
248c0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
248d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c  else{.      winL
248e0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
248f0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
24900 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o!=ERROR_FILE_NO
24910 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45  T_FOUND && lastE
24920 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48  rrno!=ERROR_PATH
24930 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
24940 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24950 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
24960 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
24970 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
24980 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
24990 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
249a0 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20  ccess",.        
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
249d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
249e0 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
249f0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
24a00 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
24a10 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
24a20 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
24a30 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
24a40 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
24a50 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
24a60 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
24a70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
24a80 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24a90 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
24aa0 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
24ab0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
24ac0 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
24ad0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
24ae0 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
24af0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
24b00 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
24b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24b20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
24b30 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
24b40 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
24b50 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
24b60 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
24b70 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
24b80 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
24b90 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
24ba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
24bb0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
24bc0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
24bd0 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
24be0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
24bf0 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
24c00 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
24c10 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
24c20 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
24c30 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
24c40 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
24c50 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
24c60 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
24c70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24c80 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
24c90 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
24ca0 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74  ied path name st
24cb0 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
24cc0 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c  e letter.** foll
24cd0 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20  owed by a colon 
24ce0 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
24cf0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
24d00 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
24d10 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
24d20 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
24d30 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65   return ( sqlite
24d40 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
24d50 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
24d60 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d  ame[1]==':' );.}
24d70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
24d80 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
24d90 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
24da0 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
24db0 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
24dc0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
24dd0 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
24de0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
24df0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
24e00 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
24e10 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
24e20 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
24e30 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
24e40 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
24e50 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
24e60 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
24e70 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
24e80 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
24e90 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
24ea0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
24eb0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
24ec0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24ed0 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
24ee0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
24ef0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
24f00 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
24f10 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
24f20 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
24f30 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
24f40 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
24f50 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
24f60 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
24f70 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
24f80 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
24f90 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
24fa0 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
24fb0 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
24fc0 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
24fd0 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
24fe0 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
24ff0 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
25000 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
25010 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
25020 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
25030 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
25040 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
25050 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
25060 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
25070 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b  irSep(zPathname[
25080 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0]) ){.    retur
25090 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
250a0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
250b0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
250c0 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
250d0 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
250e0 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
250f0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
25100 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
25110 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
25120 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
25130 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
25140 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
25150 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
25160 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
25170 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
25180 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
25190 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
251a0 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76    if ( winIsDriv
251b0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
251c0 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20  zPathname) ){.  
251d0 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
251e0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
251f0 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
25200 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
25210 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
25220 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
25230 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
25240 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
25250 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
25260 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
25270 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
25280 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
25290 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
252a0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
252b0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
252c0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
252d0 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
252e0 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
252f0 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
25300 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
25310 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
25320 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
25330 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
25340 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
25350 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
25360 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
25370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
25380 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
25390 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
253a0 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
253b0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
253c0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
253d0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
253e0 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
253f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
25400 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
25410 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
25420 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25440 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
25450 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69  /.){.  .#if defi
25460 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
25470 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
25480 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
25490 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
254a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
254b0 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ll);.  assert( n
254c0 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61  Full>=pVfs->mxPa
254d0 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28  thname );.  if (
254e0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
254f0 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
25500 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
25510 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
25520 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
25530 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
25540 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
25550 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
25560 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
25570 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
25580 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
25590 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
255a0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
255b0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
255c0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
255d0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
255e0 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
255f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
25600 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
25610 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
25620 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a  ry and a slash..
25630 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
25640 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
25650 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
25660 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
25670 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
25680 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
25690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
256a0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
256b0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
256c0 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  h(CCP_POSIX_TO_W
256d0 49 4e 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49 56  IN_A|CCP_RELATIV
256e0 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f  E, zRelative, zO
256f0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
25710 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
25720 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
25730 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
25740 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
25750 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25760 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
25770 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c  H, (DWORD)errno,
25780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25790 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
257a0 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
257b0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
257c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
257d0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
257e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
257f0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73 25  ), zFull, "%s%s%
25800 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
25810 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25820 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
25830 20 77 69 6e 47 65 74 44 69 72 44 65 70 28 29 2c   winGetDirDep(),
25840 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
25850 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
25860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
25870 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
25880 68 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  h(CCP_POSIX_TO_W
25890 49 4e 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c  IN_A, zRelative,
258a0 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c 30   zFull, nFull)<0
258b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
258c0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
258d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
258e0 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
258f0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
25910 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
25920 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
25930 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
25950 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  if..#if (SQLITE_
25960 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
25970 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20  TE_OS_WINRT) && 
25980 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
25990 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
259a0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
259b0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
259c0 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f   /* WinCE has no
259d0 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65   concept of a re
259e0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c  lative pathname,
259f0 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64   or so I am told
25a00 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20  . */.  /* WinRT 
25a10 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f  has no way to co
25a20 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65  nvert a relative
25a30 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f   path to an abso
25a40 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69  lute one. */.  i
25a50 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
25a60 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
25a70 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
25a80 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
25a90 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
25aa0 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
25ab0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
25ac0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
25ad0 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
25ae0 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
25af0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
25b00 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
25b10 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
25b20 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
25b30 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
25b40 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
25b50 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
25b60 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
25b70 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
25b80 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
25b90 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b  ctory and a back
25ba0 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
25bb0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25bc0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
25bd0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
25be0 20 7a 46 75 6c 6c 2c 20 22 25 73 25 73 25 73 22   zFull, "%s%s%s"
25bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
25c10 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
25c20 69 6e 47 65 74 44 69 72 44 65 70 28 29 2c 20 7a  inGetDirDep(), z
25c30 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c  Relative);.  }el
25c40 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
25c50 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
25c60 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
25c70 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
25c80 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
25c90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25ca0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
25cb0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
25cc0 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
25cd0 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
25ce0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
25cf0 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a  .  DWORD nByte;.
25d00 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
25d10 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
25d20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
25d30 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73  path name begins
25d40 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65   with "/X:", whe
25d50 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c  re "X" is any al
25d60 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68  phabetic.  ** ch
25d70 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64  aracter, discard
25d80 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22   the initial "/"
25d90 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61   from the pathna
25da0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  me..  */.  if( z
25db0 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
25dc0 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65   && winIsDriveLe
25dd0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65  tterAndColon(zRe
25de0 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20  lative+1) ){.   
25df0 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20   zRelative++;.  
25e00 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  }..  /* It's odd
25e10 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
25e20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
25e30 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
25e40 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
25e50 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
25e60 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
25e70 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
25e80 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
25e90 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
25ea0 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
25eb0 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
25ec0 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
25ed0 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
25ee0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
25ef0 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
25f00 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
25f10 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
25f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25f30 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
25f40 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
25f50 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
25f60 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
25f70 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
25f80 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
25f90 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
25fa0 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
25fb0 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
25fc0 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
25fd0 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
25fe0 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
25ff0 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
26000 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
26010 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
26020 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
26030 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
26040 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
26050 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
26060 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
26070 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
26080 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
26090 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
260a0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
260b0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
260c0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
260d0 22 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20  "%s%s%s",.      
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
260f0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
26100 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
26110 44 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Dep(), zRelative
26120 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
26130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
26140 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
26150 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
26160 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
26170 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
26180 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
26190 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
261a0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
261b0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
261c0 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
261d0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
261e0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
261f0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
26200 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
26210 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
26220 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26230 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
26240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26250 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26260 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
26270 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
26280 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
262b0 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
262c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
262d0 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
262e0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
262f0 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
26300 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
26310 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
26320 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26330 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26340 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
26350 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26360 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
26370 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
26380 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
26390 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
263a0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
263b0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
263c0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
263d0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
263e0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
263f0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
26400 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
26410 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26420 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
26430 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
26440 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
26460 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
26470 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
26480 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
26490 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
264a0 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
264b0 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
264c0 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
264d0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
264e0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
264f0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
26500 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
26510 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
26520 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
26530 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
26540 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
26550 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
26560 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
26570 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26580 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
26590 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
265a0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
265b0 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
265c0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
265f0 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61  athname3", zRela
26600 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
26610 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
26620 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
26630 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
26640 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
26650 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
26660 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
26670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26680 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
26690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
266a0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
266b0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
266c0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
266d0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
266e0 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
266f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
26700 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
26710 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26720 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
26730 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
26740 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
26750 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
26760 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
26770 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
26780 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267a0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
267b0 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me4", zRelative)
267c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
267d0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
267e0 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
267f0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
26800 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
26810 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
26820 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
26830 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f  .#endif.  if( zO
26840 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
26850 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
26860 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
26870 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
26880 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
26890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
268a0 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ut);.    return 
268b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
268c0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
268d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
268e0 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  M;.  }.#endif.}.
268f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26900 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
26910 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
26920 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
26930 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
26940 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
26950 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
26960 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
26970 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
26980 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
26990 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  rary..*/./*.** I
269a0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
269b0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
269c0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
269d0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
269e0 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
269f0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
26a00 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
26a10 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74  d library..*/.st
26a20 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c  atic void *winDl
26a30 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
26a40 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
26a50 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
26a60 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f    HANDLE h;.  vo
26a70 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
26a80 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
26a90 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
26aa0 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
26ab0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
26ac0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
26ad0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
26ae0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
26af0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
26b00 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
26b10 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50  .    h = osLoadP
26b20 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28  ackagedLibrary((
26b30 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
26b40 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20  ed, 0);.#else.  
26b50 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
26b60 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43  aryW((LPCWSTR)zC
26b70 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
26b80 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
26b90 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
26ba0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68  SI.  else{.    h
26bb0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
26bc0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
26bd0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
26be0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26bf0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72  zConverted);.  r
26c00 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a  eturn (void*)h;.
26c10 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
26c20 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  nDlError(sqlite3
26c30 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
26c40 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
26c50 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
26c60 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
26c70 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
26c80 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72  rMsg(osGetLastEr
26c90 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75  ror(), nBuf, zBu
26ca0 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20  fOut);.}.static 
26cb0 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
26cc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
26cd0 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74  s,void *pH,const
26ce0 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f   char *zSym))(vo
26cf0 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id){.  UNUSED_PA
26d00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
26d10 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
26d20 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63  (void))osGetProc
26d30 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
26d40 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )pH, zSym);.}.st
26d50 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
26d60 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
26d70 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
26d80 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
26d90 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
26da0 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
26db0 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
26dc0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
26dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
26de0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
26df0 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
26e00 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20  efine winDlOpen 
26e10 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
26e20 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
26e30 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30  ine winDlSym   0
26e40 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
26e50 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
26e60 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20  ./*.** Write up 
26e70 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  to nBuf bytes of
26e80 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f   randomness into
26e90 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
26ea0 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65   int winRandomne
26eb0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
26ec0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
26ed0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69  char *zBuf){.  i
26ee0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53  nt n = 0;.  UNUS
26ef0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
26f00 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s);.#if defined(
26f10 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e  SQLITE_TEST).  n
26f20 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65   = nBuf;.  memse
26f30 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
26f40 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  ;.#else.  if( si
26f50 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29  zeof(SYSTEMTIME)
26f60 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
26f70 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20  SYSTEMTIME x;.  
26f80 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
26f90 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
26fa0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
26fb0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
26fc0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
26fd0 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
26fe0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
26ff0 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
27000 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50   = osGetCurrentP
27010 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20  rocessId();.    
27020 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
27030 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
27040 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  d));.    n += si
27050 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23  zeof(pid);.  }.#
27060 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
27070 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  RT.  if( sizeof(
27080 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66  ULONGLONG)<=nBuf
27090 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c  -n ){.    ULONGL
270a0 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ONG cnt = osGetT
270b0 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20  ickCount64();.  
270c0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
270d0 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
270e0 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
270f0 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
27100 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
27110 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
27120 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
27130 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
27140 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
27150 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
27160 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
27170 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
27180 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (cnt);.  }.#endi
27190 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  f.  if( sizeof(L
271a0 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e  ARGE_INTEGER)<=n
271b0 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52  Buf-n ){.    LAR
271c0 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20  GE_INTEGER i;.  
271d0 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d    osQueryPerform
271e0 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
271f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
27200 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66  f[n], &i, sizeof
27210 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (i));.    n += s
27220 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65  izeof(i);.  }.#e
27230 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ndif.  return n;
27240 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
27250 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
27260 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
27270 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
27280 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
27290 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
272a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
272b0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
272c0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
272d0 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
272e0 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
272f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
27300 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
27310 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
27320 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
27330 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
27340 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
27350 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
27360 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
27370 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
27380 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
27390 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
273a0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
273b0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
273c0 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
273d0 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
273e0 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
273f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
27400 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
27410 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
27420 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
27430 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
27440 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
27450 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
27460 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
27470 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
27480 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
27490 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
274a0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
274b0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
274c0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
274d0 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
274e0 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
274f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
27500 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
27510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
27520 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
27530 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
27540 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
27550 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
27560 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
27570 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
27580 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
27590 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
275a0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
275b0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
275c0 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
275d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
275e0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
275f0 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
27600 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
27610 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
27620 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
27630 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
27640 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
27650 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
27660 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
27670 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
27680 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
27690 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31  umber of .     1
276a0 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
276b0 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
276c0 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
276d0 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20   JD 2305813.5). 
276e0 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
276f0 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
27700 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
27710 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
27720 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
27730 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
27740 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
27750 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
27760 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
27770 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
27780 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
27790 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
277a0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
277b0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
277c0 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
277d0 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
277e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
277f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
27800 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20  32BitValue = .  
27810 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
27820 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
27830 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
27840 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20  000000000 +.    
27850 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
27860 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
27870 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
27880 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
27890 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65  me;.  osGetSyste
278a0 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
278b0 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
278c0 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
278d0 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
278e0 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f  ero. */.  if (!o
278f0 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
27900 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
27910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27920 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
27930 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
27940 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
27950 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
27960 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
27970 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
27980 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
27990 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
279a0 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
279b0 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
279c0 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
279d0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
279e0 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  )ft.dwLowDateTim
279f0 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  e)/(sqlite3_int6
27a00 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66  4)10000;..#ifdef
27a10 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
27a20 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
27a30 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
27a40 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
27a50 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
27a60 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
27a70 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
27a80 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
27a90 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
27aa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27ab0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27ac0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
27ad0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
27ae0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
27af0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
27b00 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
27b10 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
27b20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
27b30 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
27b40 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
27b50 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
27b60 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
27b70 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
27b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
27b90 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
27ba0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
27bb0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
27bc0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
27bd0 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
27be0 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
27bf0 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
27c00 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
27c10 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
27c20 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
27c30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27c40 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
27c50 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
27c60 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
27c70 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
27c80 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
27c90 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
27ca0 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20  ge() on Windows 
27cb0 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
27cc0 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
27cd0 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   Unix). After an
27ce0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
27cf0 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
27d00 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
27d10 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
27d20 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
27d30 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
27d40 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
27d50 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
27d60 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
27d70 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
27d80 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
27d90 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
27da0 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
27db0 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
27dc0 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
27dd0 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
27de0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
27df0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
27e00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
27e10 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
27e20 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
27e30 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
27e40 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
27e50 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
27e60 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
27e70 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
27e80 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
27e90 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
27ea0 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
27eb0 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
27ec0 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
27ed0 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
27ee0 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
27ef0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
27f00 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
27f10 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
27f20 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
27f30 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
27f40 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
27f50 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
27f60 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
27f70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
27f80 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
27f90 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
27fa0 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
27fb0 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
27fc0 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
27fd0 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
27fe0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
27ff0 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
28000 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
28010 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
28020 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
28030 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
28040 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
28050 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
28060 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
28070 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
28080 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
28090 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
280a0 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
280b0 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
280c0 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
280d0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
280e0 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
280f0 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
28100 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
28110 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
28120 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
28130 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
28140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
28150 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
28160 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
28170 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
28180 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
28190 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
281a0 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74  .  return winGet
281b0 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47  LastErrorMsg(osG
281c0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e  etLastError(), n
281d0 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f  Buf, zBuf);.}../
281e0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
281f0 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65  and deinitialize
28200 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
28210 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e  ystem interface.
28220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
28230 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20  os_init(void){. 
28240 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
28250 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20  vfs winVfs = {. 
28260 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
28270 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
28280 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
28290 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
282a0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
282b0 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
282c0 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
282d0 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
282e0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
282f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
28300 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
28310 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ",             /
28320 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
28330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28340 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
28350 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
28360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28370 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
28380 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
28390 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
283a0 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
283b0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
283c0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
283d0 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
283e0 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
283f0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
28400 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
28410 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
28420 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
28430 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
28440 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
28450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
28460 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
28470 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
28480 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
28490 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
284a0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
284b0 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
284c0 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
284d0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
284e0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
284f0 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
28500 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
28510 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
28520 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
28530 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  tError */.    wi
28540 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
28550 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
28560 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
28570 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
28580 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
28590 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
285a0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
285b0 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
285c0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
285d0 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
285e0 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61  /* xNextSystemCa
285f0 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64  ll */.  };.#if d
28600 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
28610 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
28620 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
28630 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66  fs winLongPathVf
28640 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28660 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
28670 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
28680 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
28690 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45  le */.    SQLITE
286a0 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
286b0 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68  BYTES, /* mxPath
286c0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
286f0 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68   "win32-longpath
28700 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a  ",    /* zName *
28710 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
28720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
28730 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
28740 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
28750 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
28760 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
28770 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
28780 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
28790 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ess,           /
287a0 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
287b0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
287c0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
287d0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
287e0 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
287f0 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
28800 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
28810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
28820 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
28830 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
28840 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
28850 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
28860 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
28870 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
28880 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
28890 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
288a0 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
288b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
288c0 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
288d0 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
288e0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
288f0 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
28900 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  stError,     /* 
28910 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
28920 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
28930 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
28940 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
28950 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
28960 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53  emCall,    /* xS
28970 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
28980 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
28990 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74  Call,    /* xGet
289a0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
289b0 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
289c0 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53  all,   /* xNextS
289d0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
289e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
289f0 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74  ouble-check that
28a00 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20   the aSyscall[] 
28a10 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63  array has been c
28a20 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
28a30 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20  correctly.  See 
28a40 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38  ticket [bb3a86e8
28a50 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20  90c8e96ab] */.  
28a60 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
28a70 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 35 20  e(aSyscall)==75 
28a80 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d  );..  /* get mem
28a90 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69  ory map allocati
28aa0 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a  on granularity *
28ab0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53  /.  memset(&winS
28ac0 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ysInfo, 0, sizeo
28ad0 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b  f(SYSTEM_INFO));
28ae0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28af0 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69  INRT.  osGetNati
28b00 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  veSystemInfo(&wi
28b10 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65  nSysInfo);.#else
28b20 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  .  osGetSystemIn
28b30 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
28b40 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
28b50 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  ( winSysInfo.dwA
28b60 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
28b70 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65  rity>0 );.  asse
28b80 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  rt( winSysInfo.d
28b90 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a  wPageSize>0 );..
28ba0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
28bb0 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20  gister(&winVfs, 
28bc0 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  1);..#if defined
28bd0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
28be0 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65  S_WIDE).  sqlite
28bf0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
28c00 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20  winLongPathVfs, 
28c10 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  0);.#endif..  re
28c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
28c30 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
28c40 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23  os_end(void){ .#
28c50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
28c60 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62  RT.  if( sleepOb
28c70 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  j!=NULL ){.    o
28c80 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
28c90 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
28ca0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
28cb0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
28cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
28cd0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
28ce0 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.