/ Hex Artifact Content
Login

Artifact 0fea05bc7b75eccb01d8a8a10aaeaf4147b8e0cd:


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 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
57a0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
57b0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
57c0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
57d0: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
57e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
57f0: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
5800: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5810: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
5820: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
5830: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5860: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5870: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
5880: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
5890: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
58a0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
58b0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
58c0: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
58e0: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
58f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5900: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5910: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
5920: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5930: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5940: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5950: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
5960: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5970: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
5980: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
5990: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
59a0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
59b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
59c0: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
59d0: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
59e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5a10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
5a20: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
5a30: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
5a40: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
5a50: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
5a60: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
5a70: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5a80: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
5a90: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
5aa0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5ab0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
5ac0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ad0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
5ae0: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
5af0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5b30: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
5b40: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
5b50: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
5b60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
5b70: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
5b80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5b90: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
5ba0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5bb0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
5bc0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
5bd0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
5be0: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
5bf0: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
5c00: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
5c20: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
5c30: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
5c40: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5c50: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
5c60: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
5c70: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
5c80: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
5c90: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
5ca0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5cb0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5cd0: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5cf0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5d00: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
5d10: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5d20: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5d30: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
5d40: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
5d50: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5d60: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
5d70: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
5d80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5d90: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
5da0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5db0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
5dc0: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
5dd0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5e00: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
5e10: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
5e20: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
5e30: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5e40: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
5e50: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
5e60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5e70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5e80: 53 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  SI) && !defined(
5e90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
5ea0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
5eb0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
5ec0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5ed0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
5ee0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5ef0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
5f00: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
5f10: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5f20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5f30: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5f40: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5f50: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
5f60: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
5f70: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5f80: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
5f90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5fa0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
5fb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5fc0: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
5fd0: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
5fe0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
5ff0: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6000: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
6010: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6020: 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20  )LoadLibraryW,  
6030: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6040: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6050: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6060: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6090: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
60a0: 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44  dLibraryW ((HMOD
60b0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
60c0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  WSTR))aSyscall[4
60d0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
60e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
60f0: 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  RT.  { "LocalFre
6100: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6110: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c    (SYSCALL)Local
6120: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
6130: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6140: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6160: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6190: 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65  fine osLocalFree
61a0: 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49   ((HLOCAL(WINAPI
61b0: 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63  *)(HLOCAL))aSysc
61c0: 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74  all[45].pCurrent
61d0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
61e0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
61f0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6200: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
6210: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6220: 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20  ALL)LockFile,   
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6240: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
6250: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6260: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6270: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6280: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6290: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
62a0: 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  LockFile.#define
62b0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
62c0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
62d0: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
62e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
62f0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6300: 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  46].pCurrent).#e
6310: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
6320: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
6330: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
6340: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6350: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  LL)LockFileEx,  
6360: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6370: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6380: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6390: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
63a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
63b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
63c0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
63d0: 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e  ockFileEx.#defin
63e0: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28  e osLockFileEx (
63f0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6400: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6410: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6420: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6430: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6440: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  47].pCurrent).#e
6450: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
6460: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
6470: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
6480: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6490: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
64a0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
64b0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
64c0: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
64d0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  le,           0 
64e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
64f0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
6500: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6510: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6520: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6530: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6540: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28  sMapViewOfFile (
6550: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6560: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6570: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6580: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6590: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
65a0: 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42  nt)..  { "MultiB
65b0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20  yteToWideChar", 
65c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c      (SYSCALL)Mul
65d0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
65e0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
65f0: 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  ine osMultiByteT
6600: 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28  oWideChar ((int(
6610: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
6620: 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c  ORD,LPCSTR,int,L
6630: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
6640: 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34   int))aSyscall[4
6650: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
6660: 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61  { "QueryPerforma
6670: 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59  nceCounter", (SY
6680: 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f  SCALL)QueryPerfo
6690: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30  rmanceCounter, 0
66a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51   },..#define osQ
66b0: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
66c0: 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49  ounter ((BOOL(WI
66d0: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
66e0: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a    LARGE_INTEGER*
66f0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70  ))aSyscall[50].p
6700: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52  Current)..  { "R
6710: 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20  eadFile",       
6720: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6730: 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20  L)ReadFile,     
6740: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6750: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46  .#define osReadF
6760: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
6770: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49  I*)(HANDLE,LPVOI
6780: 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  D,DWORD,LPDWORD,
6790: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
67a0: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
67b0: 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[51].pCurrent).
67c0: 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69  .  { "SetEndOfFi
67d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
67e0: 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f  (SYSCALL)SetEndO
67f0: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  fFile,          
6800: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6810: 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28  osSetEndOfFile (
6820: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6830: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
6840: 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  52].pCurrent)..#
6850: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6860: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
6870: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
6880: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
6890: 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20  ilePointer,     
68a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
68b0: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
68c0: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
68d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6900: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
6910: 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57  ointer ((DWORD(W
6920: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
6930: 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20  ONG,PLONG, \.   
6940: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
6950: 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e  call[53].pCurren
6960: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6970: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c  OS_WINRT.  { "Sl
6980: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
6990: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
69a0: 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  )Sleep,         
69b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
69c0: 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22  else.  { "Sleep"
69d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
69e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6a10: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65  f..#define osSle
6a20: 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  ep ((VOID(WINAPI
6a30: 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61  *)(DWORD))aSysca
6a40: 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[54].pCurrent)
6a50: 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d  ..  { "SystemTim
6a60: 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20  eToFileTime",   
6a70: 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d   (SYSCALL)System
6a80: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20  TimeToFileTime, 
6a90: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6aa0: 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46   osSystemTimeToF
6ab0: 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57  ileTime ((BOOL(W
6ac0: 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59  INAPI*)(CONST SY
6ad0: 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  STEMTIME*, \.   
6ae0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
6af0: 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43  )aSyscall[55].pC
6b00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
6b20: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6b30: 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  T.  { "UnlockFil
6b40: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6b50: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
6b60: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6b70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6b80: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6ba0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6bc0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
6bd0: 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  def osUnlockFile
6be0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
6bf0: 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  kFile ((BOOL(WIN
6c00: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6c10: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
6c20: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6c30: 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43  )aSyscall[56].pC
6c40: 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a  urrent).#endif..
6c50: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6c60: 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  INCE.  { "Unlock
6c70: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6c80: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c      (SYSCALL)Unl
6c90: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
6ca0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6cb0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
6cc0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
6cd0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6d00: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46  define osUnlockF
6d10: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
6d20: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6d30: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
6d40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
6d50: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
6d60: 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [57].pCurrent)..
6d70: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6d80: 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NCE || !defined(
6d90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
6da0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
6db0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6dc0: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
6dd0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
6de0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6df0: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
6e00: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
6e10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6e30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6e40: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
6e50: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
6e60: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
6e70: 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72  yscall[58].pCurr
6e80: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
6e90: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
6ea0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
6eb0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
6ec0: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
6ed0: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
6ee0: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
6ef0: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
6f00: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
6f10: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
6f20: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
6f30: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  OOL))aSyscall[59
6f40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6f50: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6f70: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6f90: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
6fa0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
6fb0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
6fc0: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
6fd0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6fe0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
6ff0: 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72  yscall[60].pCurr
7000: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7010: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43  _OS_WINRT.  { "C
7020: 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20  reateEventExW", 
7030: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7040: 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  L)CreateEventExW
7050: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
7060: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
7070: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
7080: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
70b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
70c0: 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48  eateEventExW ((H
70d0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
70e0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
70f0: 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a  UTES,LPCWSTR, \.
7100: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
7110: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31  ORD))aSyscall[61
7120: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7130: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7140: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7150: 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20  ngleObject",    
7160: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
7170: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20  rSingleObject,  
7180: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7190: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
71a0: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
71b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
71d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
71e0: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
71f0: 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52  gleObject ((DWOR
7200: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7210: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  E, \.        DWO
7220: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7230: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7240: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7250: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7260: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7270: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7280: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20  ingleObjectEx,  
7290: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
72a0: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
72b0: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
72c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
72e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
72f0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
7300: 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52  eObjectEx ((DWOR
7310: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7320: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
7330: 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c     BOOL))aSyscal
7340: 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[63].pCurrent).
7350: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7360: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
7370: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7380: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
7390: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20  FilePointerEx,  
73a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
73b0: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
73c0: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
73d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7400: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
7410: 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c  PointerEx ((BOOL
7420: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7430: 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20  ,LARGE_INTEGER, 
7440: 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45  \.        PLARGE
7450: 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29  _INTEGER,DWORD))
7460: 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75  aSyscall[64].pCu
7470: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7480: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7490: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
74a0: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
74b0: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
74c0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
74d0: 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73  dleEx, 0 },.#els
74e0: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e  e.  { "GetFileIn
74f0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
7500: 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  eEx", (SYSCALL)0
7510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7520: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7530: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
7540: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7550: 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  ndleEx ((BOOL(WI
7560: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
7570: 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e  .        FILE_IN
7580: 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41  FO_BY_HANDLE_CLA
7590: 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29  SS,LPVOID,DWORD)
75a0: 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43  )aSyscall[65].pC
75b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
75c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
75d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
75e0: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d  OMIT_WAL).  { "M
75f0: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7600: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
7610: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  L)MapViewOfFileF
7620: 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a  romApp,    0 },.
7630: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7640: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
7650: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7680: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
7690: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
76a0: 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  pp ((LPVOID(WINA
76b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e  PI*)(HANDLE,ULON
76c0: 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20  G,ULONG64, \.   
76d0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
76e0: 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65  scall[66].pCurre
76f0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7700: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7710: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
7720: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7730: 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20  )CreateFile2,   
7740: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7750: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7760: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
7770: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
77a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
77b0: 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c  ateFile2 ((HANDL
77c0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
77d0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  TR,DWORD,DWORD,D
77e0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
77f0: 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  LPCREATEFILE2_EX
7800: 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
7810: 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e  S))aSyscall[67].
7820: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7830: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
7840: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
7850: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
7860: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
7870: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
7880: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c  ,     (SYSCALL)L
7890: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
78a0: 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ry,     0 },.#el
78b0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  se.  { "LoadPack
78c0: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
78d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7900: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50  .#define osLoadP
7910: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28  ackagedLibrary (
7920: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
7930: 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  )(LPCWSTR, \.   
7940: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
7950: 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e  call[68].pCurren
7960: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7970: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
7980: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
7990: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
79a0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20  GetTickCount64, 
79b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
79c0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
79d0: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
79e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7a10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
7a20: 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f  ickCount64 ((ULO
7a30: 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  NGLONG(WINAPI*)(
7a40: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  VOID))aSyscall[6
7a50: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
7a60: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7a70: 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  T.  { "GetNative
7a80: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
7a90: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74   (SYSCALL)GetNat
7aa0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  iveSystemInfo,  
7ab0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7ac0: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
7ad0: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
7ae0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7b00: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7b10: 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53  ine osGetNativeS
7b20: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
7b30: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
7b40: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e       LPSYSTEM_IN
7b50: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d  FO))aSyscall[70]
7b60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7b70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
7b80: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
7b90: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
7ba0: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
7bb0: 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62  YSCALL)OutputDeb
7bc0: 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20  ugStringA,      
7bd0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7be0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
7bf0: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
7c00: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7c20: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7c30: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
7c40: 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e  ringA ((VOID(WIN
7c50: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
7c60: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
7c70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
7c80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
7c90: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75  AS_WIDE).  { "Ou
7ca0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
7cb0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
7cc0: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
7cd0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
7ce0: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
7cf0: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
7d00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7d30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
7d40: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20  putDebugStringW 
7d50: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
7d60: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
7d70: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
7d80: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73  .  { "GetProcess
7d90: 48 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20  Heap",          
7da0: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
7db0: 65 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20  essHeap,        
7dc0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7dd0: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
7de0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7df0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
7e00: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
7e10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7e20: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
7e30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
7e40: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
7e50: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22  eMappingFromApp"
7e60: 2c 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74  , (SYSCALL)Creat
7e70: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
7e80: 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  App, 0 },.#else.
7e90: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
7ea0: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
7eb0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7ee0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
7ef0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
7f00: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7f10: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
7f20: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
7f30: 41 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47  ATTRIBUTES,ULONG
7f40: 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52  ,ULONG64,LPCWSTR
7f50: 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70  ))aSyscall[74].p
7f60: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
7f70: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
7f80: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
7f90: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
7fa0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
7fb0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
7fc0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
7fd0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
7fe0: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
7ff0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
8000: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
8010: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
8020: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
8030: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
8040: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
8050: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
8060: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
8070: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
8080: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
8090: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
80a0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
80b0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
80c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
80d0: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
80e0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
80f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
8100: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8110: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
8120: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
8130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
8140: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
8150: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
8160: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
8170: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
8180: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
8190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
81a0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
81b0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
81c0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
81d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
81e0: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
81f0: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
8200: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
8210: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
8220: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
8230: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
8240: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
8250: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
8260: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
8270: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
8280: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
8290: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
82a0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
82b0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
82c0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
82d0: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
82e0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
82f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
8300: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
8310: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
8320: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
8330: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
8340: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
8350: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
8360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8370: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
8380: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
8390: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
83a0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
83b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
83c0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
83d0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
83e0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
83f0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
8400: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
8410: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
8420: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
8430: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
8440: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
8450: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
8460: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
8470: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8480: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
8490: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
84a0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
84b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
84c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
84d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
84e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
84f0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
8500: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
8510: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
8520: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
8530: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
8540: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
8550: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
8560: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
8570: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
8580: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
8590: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
85a0: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
85b0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
85c0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
85d0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
85e0: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
85f0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
8600: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8610: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
8620: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
8630: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
8640: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
8650: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
8660: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
8670: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
8680: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
8690: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
86a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
86b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
86c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
86d0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
86e0: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
86f0: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
8700: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
8710: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
8720: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
8730: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8740: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
8750: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
8760: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
8770: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
8780: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
8790: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
87a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
87b0: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
87c0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
87d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
87e0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
87f0: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
8800: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
8810: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
8820: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
8830: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
8840: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8850: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
8860: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
8870: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8880: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
8890: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
88a0: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
88b0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
88c0: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
88d0: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
88e0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
88f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8900: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8910: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
8920: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
8930: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
8940: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
8950: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
8960: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
8970: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
8980: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
8990: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
89a0: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
89b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
89c0: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
89d0: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
89e0: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
89f0: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
8a00: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
8a10: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
8a20: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
8a30: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
8a40: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
8a50: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
8a60: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
8a70: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
8a80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8a90: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
8aa0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8ab0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
8ac0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
8ad0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
8ae0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
8af0: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
8b00: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
8b10: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
8b20: 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  n);.    osOutput
8b30: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62  DebugStringA(zDb
8b40: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
8b50: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
8b60: 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a  gStringA(zBuf);.
8b70: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
8b80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
8b90: 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65  AS_WIDE).  memse
8ba0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
8bb0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
8bc0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28  UF_SIZE);.  if (
8bd0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
8be0: 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20  deChar(.        
8bf0: 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41    osAreFileApisA
8c00: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
8c10: 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42   CP_OEMCP, 0, zB
8c20: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d  uf,.          nM
8c30: 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67  in, (LPWSTR)zDbg
8c40: 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  Buf, SQLITE_WIN3
8c50: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73  2_DBG_BUF_SIZE/s
8c60: 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30  izeof(WCHAR))<=0
8c70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
8c80: 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65    }.  osOutputDe
8c90: 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57  bugStringW((LPCW
8ca0: 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65  STR)zDbgBuf);.#e
8cb0: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
8cc0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
8cd0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
8ce0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
8cf0: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
8d00: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
8d10: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
8d20: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
8d30: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
8d40: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
8d50: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
8d60: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
8d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
8d80: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
8d90: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
8da0: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
8db0: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
8dc0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
8dd0: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
8de0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
8df0: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
8e00: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
8e10: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
8e20: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
8e30: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
8e40: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
8e50: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
8e60: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
8e70: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8e80: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
8e90: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
8ea0: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
8eb0: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
8ec0: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
8ed0: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
8ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
8f10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
8f20: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
8f30: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
8f40: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
8f50: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
8f60: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
8f70: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
8f80: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
8f90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8fa0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
8fb0: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
8fc0: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
8fd0: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
8fe0: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
8ff0: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
9000: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
9010: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
9020: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
9030: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
9040: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
9050: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
9060: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
9070: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
9080: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
9090: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
90a0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
90b0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
90c0: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
90d0: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
90e0: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
90f0: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
9100: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
9110: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
9120: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
9130: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
9140: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
9150: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
9160: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
9170: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
9180: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
9190: 50 49 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  PI..*/.#ifndef N
91a0: 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64 65 66  TDDI_WIN8.#  def
91b0: 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38 20 20  ine NTDDI_WIN8  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 30 78 30 36 30 32 30 30 30 30        0x06020000
91e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
91f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
9200: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9210: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
9220: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
9230: 49 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  I).# define osIs
9240: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20  NT()  (1).#elif 
9250: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9260: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
9270: 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28  # define osIsNT(
9280: 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73  )  (0).#else.  s
9290: 74 61 74 69 63 20 69 6e 74 20 6f 73 49 73 4e 54  tatic int osIsNT
92a0: 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20  (void){.    if( 
92b0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
92c0: 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
92d0: 64 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29  d(NTDDI_VERSION)
92e0: 20 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f   && NTDDI_VERSIO
92f0: 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 38 0a  N >= NTDDI_WIN8.
9300: 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49        OSVERSIONI
9310: 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOW sInfo;.    
9320: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
9330: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
9340: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
9350: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
9360: 78 57 28 26 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  xW(&sInfo);.#els
9370: 65 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f  e.      OSVERSIO
9380: 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20  NINFOA sInfo;.  
9390: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
93a0: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
93b0: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
93c0: 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f       osGetVersio
93d0: 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 23 65  nExA(&sInfo);.#e
93e0: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
93f0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e  e3_os_type = sIn
9400: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
9410: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
9420: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
9430: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
9440: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
9450: 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ==2;.  }.#endif.
9460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
9470: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
9480: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
9490: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
94a0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
94b0: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
94c0: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
94d0: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
94e0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
94f0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
9500: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
9510: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
9520: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
9530: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
9540: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9550: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9560: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
9570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
9580: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
9590: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
95a0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
95b0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
95c0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
95d0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
95e0: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
95f0: 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41  );.  p = osHeapA
9600: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
9610: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9620: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
9630: 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29  tes);.  if( !p )
9640: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
9650: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
9660: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41  "failed to HeapA
9670: 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25  lloc %u bytes (%
9680: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
96a0: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
96b0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
96c0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
96d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
96e0: 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   Free memory..*/
96f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9700: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
9710: 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20  rior){.  HANDLE 
9720: 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  hHeap;..  winMem
9730: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
9740: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
9750: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
9760: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
9770: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
9780: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
9790: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
97a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
97b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
97c0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
97d0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20  IDATE).  assert 
97e0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
97f0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
9800: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9810: 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64   pPrior) );.#end
9820: 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  if.  if( !pPrior
9830: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61   ) return; /* Pa
9840: 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65  ssing NULL to He
9850: 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69  apFree is undefi
9860: 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f  ned. */.  if( !o
9870: 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c  sHeapFree(hHeap,
9880: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9890: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
98a0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
98b0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
98c0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
98d0: 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20  apFree block %p 
98e0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
98f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9900: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
9910: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
9920: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
9930: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9940: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
9950: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
9960: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
9970: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
9980: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
9990: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
99a0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
99b0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
99c0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
99d0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
99e0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
99f0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9a00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
9a10: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
9a20: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
9a30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
9a40: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
9a50: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
9a60: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
9a70: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
9a80: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
9a90: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9aa0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
9ab0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
9ac0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
9ad0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
9ae0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
9af0: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
9b00: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9b10: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
9b20: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
9b30: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
9b40: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
9b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9b60: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
9b70: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
9b80: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
9b90: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9ba0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
9bb0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
9bc0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
9bd0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9be0: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
9bf0: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
9c00: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
9c10: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9c20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
9c30: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
9c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9c60: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
9c70: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
9c80: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
9c90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
9ca0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
9cb0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
9cc0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
9cd0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
9ce0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
9cf0: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
9d00: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
9d10: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
9d20: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
9d30: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9d40: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9d50: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
9d60: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
9d70: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
9d80: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
9d90: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9da0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9db0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9dc0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ) );.#endif.  if
9dd0: 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
9de0: 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a  .  n = osHeapSiz
9df0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
9e00: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9e10: 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28  , p);.  if( n==(
9e20: 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20  SIZE_T)-1 ){.   
9e30: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9e40: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
9e50: 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62  ed to HeapSize b
9e60: 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68  lock %p (%lu), h
9e70: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9e80: 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65           p, osGe
9e90: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
9ea0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20  oid*)hHeap);.   
9eb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
9ec0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a   return (int)n;.
9ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75  }../*.** Round u
9ee0: 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65  p a request size
9ef0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c   to the next val
9f00: 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  id allocation si
9f10: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
9f20: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
9f30: 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e  int n){.  return
9f40: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   n;.}../*.** Ini
9f50: 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
9f60: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ule..*/.static i
9f70: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
9f80: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
9f90: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69   winMemData *pWi
9fa0: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d  nMemData = (winM
9fb0: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74  emData *)pAppDat
9fc0: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  a;..  if( !pWinM
9fd0: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20  emData ) return 
9fe0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9ff0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
a000: 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d  ata->magic==WINM
a010: 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23 69 66  EM_MAGIC );..#if
a020: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
a030: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
a040: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
a050: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
a060: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70  ->hHeap ){.    p
a070: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
a080: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
a090: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
a0a0: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
a0e0: 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20  P_INIT_SIZE,.   
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
a120: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a  HEAP_MAX_SIZE);.
a130: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
a140: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
a150: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
a160: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
a170: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
a180: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
a190: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
a1a0: 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78  initSize=%u, max
a1b0: 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20  Size=%u",.      
a1c0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
a1d0: 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e  or(), SQLITE_WIN
a1e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
a1f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
a200: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
a210: 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e  SIZE, SQLITE_WIN
a220: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
a230: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a240: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a250: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
a260: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52  ata->bOwned = TR
a270: 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  UE;.    assert( 
a280: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
a290: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ned );.  }.#else
a2a0: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
a2b0: 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f  hHeap = osGetPro
a2c0: 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66  cessHeap();.  if
a2d0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
a2e0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c  hHeap ){.    sql
a2f0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
a300: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22  NOMEM,.        "
a310: 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f  failed to GetPro
a320: 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c  cessHeap (%lu)",
a330: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
a340: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
a350: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a360: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
a370: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
a380: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
a390: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
a3a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
a3b0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
a3c0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
a3d0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
a3e0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
a3f0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
a400: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
a410: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
a420: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
a430: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
a440: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
a450: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
a460: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
a470: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
a480: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
a490: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
a4a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a4b0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
a4c0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
a4d0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
a4e0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
a4f0: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
a500: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
a510: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
a520: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
a530: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
a540: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
a550: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
a560: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73  >hHeap ){.    as
a570: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
a580: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
a590: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
a5a0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
a5b0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
a5c0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
a5d0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
a5e0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65      assert( osHe
a5f0: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
a600: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
a610: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
a620: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
a630: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
a640: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
a650: 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ned ){.      if(
a660: 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28   !osHeapDestroy(
a670: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
a680: 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ap) ){.        s
a690: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
a6a0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
a6b0: 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20   to HeapDestroy 
a6c0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
a6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6e0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
a6f0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57  ror(), (void*)pW
a700: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
a710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a720: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
a730: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
a740: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
a750: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c  ata->hHeap = NUL
a760: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
a770: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
a780: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
a790: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
a7a0: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
a7b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
a7c0: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
a7d0: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
a7e0: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
a7f0: 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65  e. The.** argume
a800: 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20  nts specify the 
a810: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
a820: 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a  to manage..**.**
a830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a840: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
a850: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
a860: 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a  , and therefore.
a870: 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
a880: 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  ed to be threads
a890: 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e  afe (it is not).
a8a0: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
a8b0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
a8c0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
a8d0: 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  2(void){.  stati
a8e0: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
a8f0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d  mem_methods winM
a900: 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  emMethods = {.  
a910: 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a    winMemMalloc,.
a920: 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a      winMemFree,.
a930: 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f      winMemReallo
a940: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a  c,.    winMemSiz
a950: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75  e,.    winMemRou
a960: 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  ndup,.    winMem
a970: 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Init,.    winMem
a980: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77  Shutdown,.    &w
a990: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b  in_mem_data.  };
a9a0: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65  .  return &winMe
a9b0: 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69  mMethods;.}..voi
a9c0: 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  d sqlite3MemSetD
a9d0: 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20  efault(void){.  
a9e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
a9f0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
aa00: 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47  LOC, sqlite3MemG
aa10: 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65  etWin32());.}.#e
aa20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
aa30: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
aa40: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
aa50: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
aa60: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
aa70: 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a  e (UTF-16?). .**
aa80: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
aa90: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
aaa0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
aab0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
aac0: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
aad0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
aae0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
aaf0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
ab00: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
ab10: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
ab20: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
ab30: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
ab40: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
ab50: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
ab60: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
ab70: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ab80: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
ab90: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
aba0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
abb0: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
abc0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
abd0: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
abe0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
abf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
ac00: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
ac10: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
ac20: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
ac30: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
ac40: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
ac70: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
ac80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ac90: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
aca0: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
acb0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
acc0: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
acd0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
ace0: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
acf0: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
ad00: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
ad10: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
ad20: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
ad30: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
ad40: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
ad50: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
ad60: 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54  odeToUtf8(LPCWST
ad70: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
ad80: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
ad90: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ada0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
adb0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
adc0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
add0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
ade0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
adf0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
ae00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ae10: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
ae20: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
ae30: 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20  Zero( nByte );. 
ae40: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
ae50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ae60: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
ae70: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
ae80: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
ae90: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
aea0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
aeb0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
aee0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
aef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
af00: 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ree(zFilename);.
af10: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
af20: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
af30: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
af40: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
af50: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
af60: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
af70: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
af80: 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67   current codepag
af90: 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66  e settings for f
afa0: 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a  ile apis..** .**
afb0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
afc0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
afd0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ng is obtained.*
afe0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  * from sqlite3_m
aff0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
b000: 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54   LPWSTR winMbcsT
b010: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
b020: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
b030: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
b040: 4c 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65  LPWSTR zMbcsFile
b050: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
b060: 70 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65  page = osAreFile
b070: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
b080: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a  ACP : CP_OEMCP;.
b090: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
b0a0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
b0b0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
b0c0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
b0d0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48     0)*sizeof(WCH
b100: 41 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  AR);.  if( nByte
b110: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
b120: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73  n 0;.  }.  zMbcs
b130: 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
b140: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
b150: 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73  yte*sizeof(zMbcs
b160: 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a  Filename[0]) );.
b170: 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e    if( zMbcsFilen
b180: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
b190: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
b1a0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
b1b0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
b1c0: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
b1d0: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c  me, -1, zMbcsFil
b1e0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20         nByte);. 
b210: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
b220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b230: 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29  e(zMbcsFilename)
b240: 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e  ;.    zMbcsFilen
b250: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
b260: 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e  eturn zMbcsFilen
b270: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
b280: 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20  nvert Microsoft 
b290: 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69  Unicode to multi
b2a0: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  -byte character 
b2b0: 73 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e  string, based on
b2c0: 20 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41   the.** user's A
b2d0: 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a  NSI codepage..**
b2e0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
b2f0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
b300: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
b310: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
b320: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
b330: 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55  tatic char *winU
b340: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43  nicodeToMbcs(LPC
b350: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
b360: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
b370: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
b380: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
b390: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
b3a0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
b3b0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
b3c0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
b3d0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
b3e0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
b3f0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
b400: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
b410: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
b420: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b430: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
b440: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
b450: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
b460: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
b470: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b480: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
b490: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
b4a0: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
b4b0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
b4c0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a   -1, zFilename,.
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
b500: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
b510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
b520: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
b530: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
b540: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
b550: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
b560: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
b570: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
b580: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
b590: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
b5a0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
b5b0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
b5c0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
b5d0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
b5e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
b5f0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
b600: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
b610: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
b620: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50  lenameUtf8;.  LP
b630: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
b640: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
b650: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  MbcsToUnicode(zF
b660: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
b670: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
b680: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b690: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
b6a0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
b6b0: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
b6c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
b6d0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
b6e0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
b6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
b700: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
b710: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
b720: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
b730: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
b740: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
b750: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
b760: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
b770: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
b780: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
b790: 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  mbcs(const char 
b7a0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
b7b0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
b7c0: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
b7d0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
b7e0: 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  de = winUtf8ToUn
b7f0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
b800: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
b810: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
b820: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
b830: 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e  nameMbcs = winUn
b840: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
b850: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
b860: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
b870: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
b880: 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameMbcs;.}../*.*
b890: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b8a0: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
b8b0: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
b8c0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
b8d0: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
b8e0: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
b8f0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
b900: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
b910: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
b920: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
b930: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
b940: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
b950: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
b960: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
b970: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
b980: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
b990: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
b9a0: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
b9b0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
b9c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
b9d0: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
b9e0: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
b9f0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
ba00: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
ba10: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
ba20: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
ba30: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
ba40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
ba50: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
ba60: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
ba70: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
ba80: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
ba90: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
baa0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
bab0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
bac0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
bad0: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
bae0: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
baf0: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
bb00: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
bb10: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
bb20: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
bb30: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
bb40: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
bb50: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
bb60: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
bb70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
bb80: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
bb90: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
bba0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
bbb0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
bbc0: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
bbd0: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
bbe0: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
bbf0: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
bc00: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
bc10: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
bc20: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
bc30: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
bc40: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
bc50: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
bc60: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
bc70: 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  alueUtf8 = winUn
bc80: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c  icodeToUtf8(zVal
bc90: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ue);.      if ( 
bca0: 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b  zValueUtf8==0 ){
bcb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bcc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bcd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bce0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70  sqlite3_free(*pp
bcf0: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
bd00: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a  *ppDirectory = z
bd10: 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72  ValueUtf8;.    r
bd20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bd30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
bd40: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
bd50: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
bd60: 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c  value of winGetL
bd70: 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69  astErrorMsg.** i
bd80: 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
bd90: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
bda0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
bdb0: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
bdc0: 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
bdd0: 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
bde0: 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74  ncated)..*/.stat
bdf0: 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
be00: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
be10: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
be20: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
be30: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
be40: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
be50: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
be60: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
be70: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
be80: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
be90: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
bea0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
beb0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
bec0: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
bed0: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
bee0: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
bef0: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
bf00: 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
bf10: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
bf20: 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54  NRT.    WCHAR zT
bf30: 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57  empWide[SQLITE_W
bf40: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
bf50: 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77  CHARS+1];.    dw
bf60: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
bf70: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
bf80: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
bf90: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
bfc0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
bff0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
c060: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
c090: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20  _ERRMSG_CHARS,. 
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
c0c0: 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52  #else.    LPWSTR
c0d0: 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c   zTempWide = NUL
c0e0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
c0f0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
c100: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
c110: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
c120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
c140: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
c150: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
c180: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
c190: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
c1e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c200: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
c220: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
c230: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
c280: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
c290: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
c2a0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
c2b0: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
c2c0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c2d0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
c2e0: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
c2f0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
c300: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
c310: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
c320: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
c330: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c340: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
c350: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
c360: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
c370: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
c380: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
c390: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
c3a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
c3b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
c3c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
c3d0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
c3e0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
c3f0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
c400: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
c410: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
c420: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
c450: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
c460: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
c490: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
c4a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
c4c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
c530: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
c580: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
c590: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
c5a0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
c5b0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
c5c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
c5d0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
c5e0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
c5f0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
c600: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
c610: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
c620: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
c630: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
c640: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
c650: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
c660: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
c670: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
c680: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
c690: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
c6a0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
c6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c6c0: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
c6d0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78  , "OsError 0x%lx
c6e0: 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72   (%lu)", lastErr
c6f0: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
c700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
c710: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
c720: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
c730: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
c740: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c750: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
c760: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
c770: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
c780: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
c790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c7a0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
c7b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
c7c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c7d0: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
c7e0: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
c7f0: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
c800: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
c810: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
c820: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c830: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
c840: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
c850: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
c860: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
c870: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
c880: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
c890: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
c8a0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
c8b0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
c8c0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
c8d0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
c8e0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a  quivalent from .
c8f0: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
c900: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
c910: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
c920: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
c930: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
c940: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
c950: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
c960: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
c970: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
c980: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
c990: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
c9a0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
c9b0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
c9c0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
c9d0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
c9e0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
c9f0: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
ca00: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
ca10: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
ca20: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
ca30: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
ca40: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
ca50: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
ca60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
ca70: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
ca80: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
cab0: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
cac0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
cad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
cae0: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
caf0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
cb00: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
cb10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
cb20: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
cb30: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
cb40: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cb60: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
cb70: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
cb80: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
cbb0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
cbc0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
cbd0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
cbe0: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
cbf0: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
cc00: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
cc10: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
cc40: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
cc50: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69  Msg[0] = 0;.  wi
cc60: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
cc70: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
cc80: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
cc90: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
cca0: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
ccb0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
ccc0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
ccd0: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
cce0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
ccf0: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
cd00: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
cd10: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
cd20: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
cd30: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
cd40: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
cd50: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
cd60: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
cd70: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
cd80: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
cd90: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
cda0: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
cdb0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
cdc0: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
cdd0: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
cde0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
cdf0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
ce00: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
ce10: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
ce20: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
ce30: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
ce40: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
ce50: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
ce60: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
ce70: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
ce80: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
ce90: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
cea0: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
ceb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
cec0: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
ced0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
cee0: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
cef0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
cf00: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
cf10: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
cf20: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
cf30: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
cf40: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
cf50: 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72  atic int winIoer
cf60: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
cf70: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
cf80: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
cf90: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
cfa0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
cfb0: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
cfc0: 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52  Y;../*.** If a R
cfd0: 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69  eadFile() or Wri
cfe0: 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f  teFile() error o
cff0: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
d000: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f  is routine.** to
d010: 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c   see if it shoul
d020: 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52  d be retried.  R
d030: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
d040: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
d050: 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70  SE.** to give up
d060: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
d070: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
d080: 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20  nRetryIoerr(int 
d090: 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20  *pnRetry, DWORD 
d0a0: 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52  *pError){.  DWOR
d0b0: 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
d0c0: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70  rror();.  if( *p
d0d0: 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72  nRetry>=winIoerr
d0e0: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28  Retry ){.    if(
d0f0: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
d100: 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
d110: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
d120: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45  ;.  }.  if( e==E
d130: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
d140: 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ED ||.      e==E
d150: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
d160: 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  ION ||.      e==
d170: 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
d180: 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73  OLATION ){.    s
d190: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
d1a0: 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
d1b0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
d1c0: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
d1d0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
d1e0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
d1f0: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
d200: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
d210: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d220: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
d230: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
d240: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
d250: 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  inLogIoerr(int n
d260: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
d270: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
d280: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
d290: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
d2a0: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
d2b0: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
d2c0: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
d2d0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
d2e0: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
d2f0: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
d300: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
d310: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
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 2a 2a 2a 2a  ****************
d350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d360: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
d370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
d380: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
d390: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
d3a0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
d3b0: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
d3c0: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
d3d0: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
d3e0: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
d3f0: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
d400: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
d410: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
d420: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
d430: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
d440: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
d450: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
d460: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
d470: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
d480: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
d490: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
d4a0: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
d4b0: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
d4c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
d4d0: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
d4e0: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
d4f0: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
d500: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
d510: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
d520: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
d530: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
d540: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
d550: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
d560: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
d570: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
d580: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
d590: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
d5a0: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
d5b0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
d5c0: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
d5d0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
d5e0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
d5f0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
d600: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
d610: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
d620: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
d630: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
d640: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
d650: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
d660: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
d670: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
d680: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
d690: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
d6a0: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
d6b0: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
d6c0: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
d6d0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
d6e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
d6f0: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
d700: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
d710: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
d720: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
d730: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
d740: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
d750: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
d760: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
d770: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
d780: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
d790: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
d7a0: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
d7b0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
d7c0: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
d7d0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
d7e0: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
d7f0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
d800: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
d810: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
d820: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
d830: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
d840: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
d850: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
d860: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
d870: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
d880: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
d890: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
d8a0: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
d8b0: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
d8c0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
d8d0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
d8e0: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
d8f0: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
d900: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
d910: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
d920: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
d930: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
d940: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
d950: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
d960: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
d970: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
d980: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
d990: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
d9a0: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
d9b0: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
d9c0: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
d9d0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
d9e0: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
d9f0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
da00: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
da10: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
da20: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
da30: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
da40: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
da50: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
da60: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
da70: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
da80: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
da90: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
daa0: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
dab0: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
dac0: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
dad0: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
dae0: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
daf0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
db00: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
db10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
db20: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
db30: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
db40: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
db50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
db60: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
db70: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
db80: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
dbb0: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
dbc0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
dbd0: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
dbe0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
dbf0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
dc00: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
dc10: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
dc20: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
dc30: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
dc40: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
dc50: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
dc60: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
dc70: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
dc80: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
dc90: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
dca0: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
dcb0: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
dcc0: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
dcd0: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
dce0: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
dcf0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
dd00: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
dd10: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
dd20: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
dd30: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
dd70: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
dd80: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
ddc0: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
ddd0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
dde0: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
ddf0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
de00: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
de10: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
de20: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c  itialized */.  l
de30: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
de40: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
de50: 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20  f (lastErrno == 
de60: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
de70: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
de80: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
de90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
dea0: 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  ame);..  /* If w
deb0: 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d  e succeeded in m
dec0: 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  aking the shared
ded0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20   memory handle, 
dee0: 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  map it. */.  if(
def0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
df00: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  ){.    pFile->sh
df10: 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63  ared = (winceLoc
df20: 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  k*)osMapViewOfFi
df30: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
df40: 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
df50: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46   FILE_MAP_READ|F
df60: 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30  ILE_MAP_WRITE, 0
df70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
df80: 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20  eLock));.    /* 
df90: 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  If mapping faile
dfa0: 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61  d, close the sha
dfb0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
dfc0: 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a  e and erase it *
dfd0: 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c 65  /.    if( !pFile
dfe0: 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ->shared ){.    
dff0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e000: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
e010: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
e020: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e030: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
e040: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
e050: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
e060: 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a  eCreateLock2", z
e070: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
e080: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
e090: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
e0a0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
e0b0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
e0c0: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
e0d0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
e0e0: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
e0f0: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
e100: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
e110: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
e120: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28  nd fail */.  if(
e130: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d   pFile->hShared=
e140: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
e150: 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20   !bLogged ){.   
e160: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e170: 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
e180: 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
e190: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
e1a0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
e1b0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
e1c0: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
e1d0: 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61  eLock3", zFilena
e1e0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
e1f0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  ed = TRUE;.    }
e200: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
e210: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
e220: 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  utex);.    osClo
e230: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
e240: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
e250: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
e260: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  L;.    return SQ
e270: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
e280: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
e290: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
e2a0: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
e2b0: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
e2c0: 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20 20  f( bInit ){.    
e2d0: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68  memset(pFile->sh
e2e0: 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ared, 0, sizeof(
e2f0: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d  winceLock));.  }
e300: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
e310: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
e320: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
e330: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e340: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
e350: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
e360: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
e370: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
e380: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
e390: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
e3a0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
e3b0: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
e3c0: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
e3d0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
e3e0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
e3f0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
e400: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
e410: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
e420: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
e430: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
e440: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
e450: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
e460: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
e470: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
e480: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
e490: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e4a0: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
e4b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
e4c0: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
e4d0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
e4e0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
e4f0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
e500: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
e510: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
e520: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
e530: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
e540: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
e550: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
e560: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
e570: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e580: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
e590: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e5a0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
e5b0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
e5c0: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
e5d0: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
e5e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
e5f0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
e600: 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70  e */.    osUnmap
e610: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
e620: 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 6f  ->shared);.    o
e630: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
e640: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20  le->hShared);.. 
e650: 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20     /* Done with 
e660: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
e670: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
e680: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
e690: 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f  );    .    osClo
e6a0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
e6b0: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
e6c0: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
e6d0: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
e6e0: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
e6f0: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
e700: 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
e710: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
e720: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
e730: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
e740: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
e750: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
e760: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
e770: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
e780: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
e790: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
e7a0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
e7b0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
e7c0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
e7d0: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
e7e0: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
e7f0: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
e800: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
e810: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
e820: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
e830: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e840: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
e850: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
e860: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
e870: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
e880: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
e890: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
e8a0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
e8b0: 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
e8c0: 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
e8d0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e8e0: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e8f0: 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
e900: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
e910: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
e920: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
e930: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
e940: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
e950: 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
e960: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
e970: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
e980: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e990: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
e9a0: 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
e9b0: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
e9c0: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
e9d0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e9e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e9f0: 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
ea00: 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
ea10: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
ea20: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
ea30: 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
ea40: 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
ea50: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
ea60: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
ea70: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
ea80: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
ea90: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
eaa0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
eab0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
eac0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
ead0: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
eae0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
eaf0: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
eb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
eb10: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
eb20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
eb30: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
eb40: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
eb50: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
eb60: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
eb70: 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
eb80: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
eb90: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
eba0: 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
ebb0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
ebc0: 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
ebd0: 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
ebe0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
ebf0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
ec00: 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
ec10: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
ec20: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
ec30: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
ec40: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
ec50: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
ec60: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
ec70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
ec80: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
ec90: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
eca0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
ecb0: 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
ecc0: 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
ecd0: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
ece0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
ecf0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
ed00: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
ed10: 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
ed20: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
ed30: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
ed40: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
ed50: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
ed60: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
ed70: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
ed80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
ed90: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
eda0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
edb0: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
edc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
edd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
ede0: 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
edf0: 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
ee00: 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
ee10: 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
ee20: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
ee30: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
ee40: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
ee50: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
ee60: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
ee70: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
ee80: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
ee90: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
eea0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
eeb0: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
eec0: 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
eed0: 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
eee0: 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
eef0: 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
ef00: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
ef10: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
ef20: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ef30: 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
ef40: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
ef50: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
ef60: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
ef70: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
ef80: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
ef90: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
efa0: 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
efb0: 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
efc0: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
efd0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
efe0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
eff0: 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
f000: 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
f010: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
f020: 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
f030: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
f040: 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
f050: 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
f060: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
f070: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
f080: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
f090: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
f0a0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
f0b0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
f0c0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
f0d0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
f0e0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
f0f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
f100: 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
f110: 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
f120: 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
f130: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
f140: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f150: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
f160: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
f170: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
f190: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
f1a0: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
f1b0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
f1c0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
f1d0: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
f1e0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
f1f0: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
f200: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
f210: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
f220: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
f230: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
f240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f250: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
f260: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
f270: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
f280: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
f290: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
f2a0: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
f2b0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
f2c0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
f2d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f2e0: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
f2f0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
f300: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
f310: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
f320: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
f330: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
f340: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
f350: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
f360: 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
f370: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
f380: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
f390: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
f3a0: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
f3b0: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
f3c0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
f3d0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
f3e0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f3f0: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
f400: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
f410: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
f420: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
f430: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
f440: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
f450: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
f460: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
f470: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
f480: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
f490: 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
f4a0: 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
f4b0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
f4c0: 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
f520: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f530: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
f540: 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
f550: 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
f560: 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
f570: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
f580: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
f590: 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
f5a0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
f5b0: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
f5c0: 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
f5d0: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
f5e0: 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
f5f0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
f600: 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
f610: 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
f620: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
f630: 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
f640: 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
f650: 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
f660: 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
f670: 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
f680: 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
f690: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
f6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f6b0: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
f6c0: 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
f6d0: 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
f6e0: 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
f6f0: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
f700: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
f710: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
f720: 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
f730: 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
f740: 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
f750: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
f760: 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
f770: 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
f780: 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
f790: 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
f7a0: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
f7b0: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
f7c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
f7d0: 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
f7e0: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
f7f0: 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
f800: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
f810: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
f820: 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
f830: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
f840: 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
f850: 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
f860: 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
f870: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
f880: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
f890: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
f8a0: 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
f8b0: 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
f8c0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
f8d0: 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
f8e0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
f8f0: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
f900: 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
f910: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
f920: 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
f930: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
f940: 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
f950: 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
f960: 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
f970: 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
f980: 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
f990: 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
f9b0: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
f9c0: 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
f9d0: 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
f9e0: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
f9f0: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
fa00: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
fa10: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
fa20: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
fa30: 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
fa40: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
fa50: 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
fa60: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
fa70: 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
fa80: 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
fa90: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
faa0: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
fab0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
fac0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
fad0: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
fae0: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
faf0: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb10: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
fb20: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
fb80: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
fb90: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
fba0: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
fbb0: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
fbc0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
fbd0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
fbe0: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
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 2a 2a 2a  ****************
fc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
fc40: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
fc50: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
fc60: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
fc70: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
fc80: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
fc90: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
fca0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
fcb0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
fcc0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
fcd0: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
fce0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
fcf0: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
fd00: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
fd10: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
fd20: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
fd30: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
fd40: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
fd50: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
fd60: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
fd70: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
fd80: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
fd90: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
fda0: 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
fdb0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
fdc0: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
fdd0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
fde0: 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
fdf0: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
fe00: 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
fe10: 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
fe20: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
fe30: 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe50: 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
fe60: 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
fe70: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
fe80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
fe90: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
fea0: 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
feb0: 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
fec0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
fed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fee0: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
fef0: 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
ff00: 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
ff10: 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
ff20: 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
ff30: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
ff40: 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
ff50: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
ff60: 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
ff70: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
ff80: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
ff90: 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
ffa0: 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
ffb0: 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
ffc0: 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
ffd0: 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
ffe0: 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
fff0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
10000 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
10010 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
10020 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
10030 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
10040 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
10050 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
10060 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
10070 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
10080 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
10090 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
100a0 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
100b0 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
100c0 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
100d0 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
100e0 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
100f0 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  urred, it is als
10100 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
10110 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
10120 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
10130 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
10140 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
10150 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
10160 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
10170 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
10180 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
10190 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
101a0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
101b0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
101c0 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
101d0 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
101e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
101f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
10200 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10210 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
10220 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10240 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
10250 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
10260 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
10270 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
10280 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
10290 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
102a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
102b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
102c0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
102d0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
102e0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
102f0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
10300 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
10310 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
10320 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
10330 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
10340 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
10350 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
10360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10370 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
10380 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
103b0 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
103c0 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
103d0 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
103e0 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
103f0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
10400 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
10410 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
10420 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
10430 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10440 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
10450 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
10460 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
10470 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
10480 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10490 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
104a0 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
104b0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
104c0 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
104d0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
104e0 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
104f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
10500 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
10510 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
10520 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
10530 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
10540 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
10550 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
10560 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10570 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
10580 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
10590 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
105a0 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
105b0 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
105c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
105d0 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
105e0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
105f0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
10600 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
10610 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
10620 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
10630 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
10640 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
10650 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
10660 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
10670 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
10680 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
10690 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
106a0 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
106b0 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
106c0 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
106d0 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
106e0 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
106f0 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
10700 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
10710 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
10720 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
10730 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
10740 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
10750 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
10760 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
10770 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
10780 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
10790 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
107a0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
107b0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
107c0 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
107d0 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
107e0 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
107f0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
10800 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
10810 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
10820 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
10830 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
10840 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
10850 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
10860 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
10870 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
10880 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
10890 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
108a0 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
108b0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
108c0 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
108d0 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
108e0 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
108f0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
10900 45 3e 30 0a 20 20 72 63 20 3d 20 77 69 6e 55 6e  E>0.  rc = winUn
10910 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
10920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10930 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
10940 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20  .#endif..  do{. 
10950 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48     rc = osCloseH
10960 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
10970 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
10980 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
10990 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
109a0 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
109b0 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
109c0 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
109d0 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74  TTEMPT && (sqlit
109e0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
109f0 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
10a00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
10a10 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
10a20 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
10a30 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
10a40 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
10a50 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
10a60 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
10a70 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
10a80 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
10a90 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
10aa0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
10ab0 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
10ac0 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
10ad0 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
10ae0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
10af0 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
10b00 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
10b10 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
10b20 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
10b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
10b40 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
10b50 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
10b60 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
10b70 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
10b80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10b90 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
10ba0 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
10bb0 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  dif.  if( rc ){.
10bc0 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e      pFile->h = N
10bd0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43  ULL;.  }.  OpenC
10be0 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53  ounter(-1);.  OS
10bf0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69  TRACE(("CLOSE fi
10c00 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
10c10 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20   pFile->h, rc ? 
10c20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
10c30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
10c40 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
10c50 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
10c60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10c70 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
10c80 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
10cb0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
10cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
10cd0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
10ce0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
10cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10d00 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
10d10 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
10d20 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
10d30 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
10d40 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
10d50 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
10d60 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
10d70 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
10d80 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
10d90 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
10da0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
10db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10dc0 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
10dd0 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
10de0 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10e10 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
10e20 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
10e30 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
10e40 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
10e50 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
10e60 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
10e70 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
10e80 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
10e90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
10ea0 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
10eb0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
10ec0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10ed0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
10ee0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
10ef0 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10f20 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
10f30 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
10f40 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
10f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
10f70 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
10f80 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
10f90 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
10fa0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
10fb0 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
10fc0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
10fd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
10fe0 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
10ff0 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75  READ file=%p, bu
11000 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
11010 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
11020 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
11030 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
11040 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
11050 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
11060 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
11070 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
11080 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
11090 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
110a0 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
110b0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
110c0 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
110d0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
110e0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
110f0 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
11100 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
11110 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
11120 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
11130 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
11140 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
11150 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
11160 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
11170 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
11180 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  ], amt);.      O
11190 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d  STRACE(("READ-MM
111a0 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AP file=%p, rc=S
111b0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
111c0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
111d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
111f0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
11200 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
11210 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
11220 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
11230 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
11240 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
11250 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
11260 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
11270 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
11280 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
11290 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
112a0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
112b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
112c0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
112d0 4e 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65  NCE.  if( winSee
112e0 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
112f0 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52  set) ){.    OSTR
11300 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
11310 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
11320 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  LL\n", pFile->h)
11330 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11340 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
11350 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
11360 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
11370 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
11380 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d   0) ){.#else.  m
11390 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
113a0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
113b0 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65  RLAPPED));.  ove
113c0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
113d0 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
113e0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
113f0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
11400 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
11410 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
11420 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69  7fffffff);.  whi
11430 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
11440 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
11450 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76  amt, &nRead, &ov
11460 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20  erlapped) &&.   
11470 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
11480 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41  rror()!=ERROR_HA
11490 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64  NDLE_EOF ){.#end
114a0 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  if.    DWORD las
114b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20  tErrno;.    if( 
114c0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
114d0 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
114e0 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
114f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11500 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
11510 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
11520 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
11530 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
11540 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
11550 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
11560 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11570 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
11580 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
115b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
115c0 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72   }.  winLogIoerr
115d0 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20  (nRetry);.  if( 
115e0 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74  nRead<(DWORD)amt
115f0 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   ){.    /* Unrea
11600 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
11610 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
11620 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
11630 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
11640 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30  )pBuf)[nRead], 0
11650 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20  , amt-nRead);.  
11660 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
11670 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
11680 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
11690 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  READ\n", pFile->
116a0 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
116b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
116c0 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
116d0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
116e0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
116f0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
11700 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
11710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11720 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
11730 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
11740 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
11750 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
11760 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
11770 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
11780 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
11790 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
117a0 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
117b0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
117c0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
117d0 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
117e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
117f0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
11800 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
11810 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
11820 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
11850 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
11860 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11870 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
11880 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
11890 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
118a0 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
118b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
118c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
118d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
118e0 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
118f0 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65  rred, else false
11900 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
11910 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
11920 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
11930 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ndle */.  int nR
11940 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
11950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11960 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a  ber of retries *
11970 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  /..  assert( amt
11980 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
11990 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
119a0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
119b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
119c0 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74  RITE);.  Simulat
119d0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72  eDiskfullError(r
119e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
119f0 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  L);..  OSTRACE((
11a00 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20  "WRITE file=%p, 
11a10 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e  buffer=%p, amoun
11a20 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  t=%d, offset=%ll
11a30 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  d, lock=%d\n",. 
11a40 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11a50 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
11a60 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
11a70 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
11a80 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11a90 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
11aa0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
11ab0 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
11ac0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
11ad0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
11ae0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
11af0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
11b00 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
11b10 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
11b20 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
11b30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
11b40 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
11b50 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
11b60 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
11b70 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
11b80 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
11b90 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
11ba0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
11bb0 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20  E-MMAP file=%p, 
11bc0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
11bd0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
11be0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11bf0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
11c00 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
11c10 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
11c20 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
11c30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
11c40 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
11c50 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
11c60 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
11c70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
11c80 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
11c90 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
11ca0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
11cb0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
11cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
11cd0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
11ce0 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77  S_WINCE.  rc = w
11cf0 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65  inSeekFile(pFile
11d00 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
11d10 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a   rc==0 ){.#else.
11d20 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21    {.#endif.#if !
11d30 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11d40 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
11d50 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
11d60 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
11d70 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a  for WriteFile. *
11d80 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  /.#endif.    u8 
11d90 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42  *aRem = (u8 *)pB
11da0 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  uf;        /* Da
11db0 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  ta yet to be wri
11dc0 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
11dd0 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20  nRem = amt;     
11de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11df0 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74  ber of bytes yet
11e00 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
11e10 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69  /.    DWORD nWri
11e20 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
11e30 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69      /* Bytes wri
11e40 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69  tten by each Wri
11e50 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f  teFile() call */
11e60 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
11e70 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
11e80 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
11e90 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
11ea0 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21  rror() */..#if !
11eb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11ec0 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72      memset(&over
11ed0 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f  lapped, 0, sizeo
11ee0 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
11ef0 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
11f00 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
11f10 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
11f20 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  ff);.    overlap
11f30 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
11f40 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
11f50 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
11f60 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  f);.#endif..    
11f70 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b  while( nRem>0 ){
11f80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
11f90 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20 21  INCE.      if( !
11fa0 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
11fb0 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
11fc0 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
11fd0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
11fe0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
11ff0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
12000 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76  em, &nWrite, &ov
12010 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e  erlapped) ){.#en
12020 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
12030 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
12040 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
12050 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
12060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12070 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
12080 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  rt( nWrite==0 ||
12090 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29   nWrite<=(DWORD)
120a0 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  nRem );.      if
120b0 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
120c0 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65  Write>(DWORD)nRe
120d0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  m ){.        las
120e0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
120f0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
12100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12110 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  }.#if !SQLITE_OS
12120 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66  _WINCE.      off
12130 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  set += nWrite;. 
12140 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
12150 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
12160 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
12170 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72  fff);.      over
12180 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
12190 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
121a0 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
121b0 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ffff);.#endif.  
121c0 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69      aRem += nWri
121d0 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d  te;.      nRem -
121e0 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a  = nWrite;.    }.
121f0 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29      if( nRem>0 )
12200 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
12210 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12220 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
12230 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
12240 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
12250 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61  f(   ( pFile->la
12260 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48  stErrno==ERROR_H
12270 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20  ANDLE_DISK_FULL 
12280 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46  ).       || ( pF
12290 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
122a0 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20  ERROR_DISK_FULL 
122b0 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  )){.      OSTRAC
122c0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
122d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
122e0 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  L\n", pFile->h))
122f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
12300 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12310 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c  E_FULL, pFile->l
12320 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20     "winWrite1", 
12350 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12360 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
12370 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
12380 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12390 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c  R_WRITE\n", pFil
123a0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
123b0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
123c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
123d0 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
123e0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
123f0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12400 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  Write2", pFile->
12410 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
12420 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
12430 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20  (nRetry);.  }.  
12440 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
12450 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12460 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
12470 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
12480 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12490 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
124a0 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
124b0 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
124c0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
124d0 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
124e0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
124f0 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
12500 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12510 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
12520 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
12530 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
12540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
12550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12560 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74  eturn code for t
12570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
12580 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
12590 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  o;..  assert( pF
125a0 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
125b0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
125c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
125d0 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43  NCATE);.  OSTRAC
125e0 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c  E(("TRUNCATE fil
125f0 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c  e=%p, size=%lld,
12600 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
12610 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
12620 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e  , nByte, pFile->
12630 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
12640 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
12650 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
12660 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
12670 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
12680 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
12690 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
126a0 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
126b0 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
126c0 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
126d0 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
126e0 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
126f0 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
12700 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
12710 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
12720 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
12730 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
12740 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
12750 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
12760 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
12770 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
12780 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
12790 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f   }..  /* SetEndO
127a0 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20  fFile() returns 
127b0 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75  non-zero when su
127c0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72  ccessful, or zer
127d0 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e  o when it fails.
127e0 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65   */.  if( winSee
127f0 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79  kFile(pFile, nBy
12800 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  te) ){.    rc = 
12810 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
12820 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
12830 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
12840 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
12850 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
12860 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d  uncate1", pFile-
12870 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
12880 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64   if( 0==osSetEnd
12890 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
128a0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
128b0 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
128c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
128d0 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50  =ERROR_USER_MAPP
128e0 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20  ED_FILE) ){.    
128f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12900 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
12910 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
12920 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12930 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
12940 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c   "winTruncate2",
12970 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12980 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
12990 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
129a0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
129b0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
129c0 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
129d0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
129e0 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20  tly.  ** mapped 
129f0 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74  region, reduce t
12a00 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70  he effective map
12a10 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c  ping size as wel
12a20 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20  l. SQLite will. 
12a30 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
12a40 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
12a50 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
12a60 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
12a70 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20   now on..  */.  
12a80 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
12a90 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70  egion && nByte<p
12aa0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
12ab0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  {.    pFile->mma
12ac0 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  pSize = nByte;. 
12ad0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54   }.#endif..  OST
12ae0 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
12af0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
12b00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
12b10 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
12b20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12b30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
12b40 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
12b50 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12b60 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
12b70 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
12b80 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
12b90 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
12ba0 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
12bb0 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68  e occuring at th
12bc0 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
12bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
12be0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
12bf0 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
12c00 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
12c10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
12c20 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
12c30 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
12c40 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
12c50 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ted to disk..*/.
12c60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79  static int winSy
12c70 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
12c80 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
12c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12ca0 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a  NO_SYNC.  /*.  *
12cb0 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e  * Used only when
12cc0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
12cd0 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a  is not defined..
12ce0 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b     */.  BOOL rc;
12cf0 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
12d00 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
12d10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12d20 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20  NO_SYNC) || \.  
12d30 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54    (defined(SQLIT
12d40 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
12d50 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
12d60 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  ).  /*.  ** Used
12d70 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
12d80 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
12d90 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61  ned and by the a
12da0 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20  ssert() and/or. 
12db0 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61   ** OSTRACE() ma
12dc0 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69  cros..   */.  wi
12dd0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12de0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c  winFile*)id;.#el
12df0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
12e00 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69  METER(id);.#endi
12e10 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
12e20 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  le );.  /* Check
12e30 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
12e40 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
12e50 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
12e60 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
12e70 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
12e80 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
12e90 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
12ea0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
12eb0 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
12ec0 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
12ed0 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
12ee0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
12ef0 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
12f00 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
12f10 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
12f20 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
12f30 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
12f40 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
12f50 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
12f60 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
12f70 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f  ITE_FULL );..  O
12f80 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
12f90 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
12fa0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
12fb0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
12fc0 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e  , flags, pFile->
12fd0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
12fe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  ndef SQLITE_TEST
12ff0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13000 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73  TER(flags);.#els
13010 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30  e.  if( (flags&0
13020 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
13030 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  C_FULL ){.    sq
13040 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
13050 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  ount++;.  }.  sq
13060 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
13070 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
13080 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
13090 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
130a0 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
130b0 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
130c0 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
130d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
130e0 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28  _SYNC.  OSTRACE(
130f0 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d  ("SYNC-NOP file=
13100 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13110 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13120 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13130 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  _OK;.#else.  rc 
13140 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  = osFlushFileBuf
13150 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
13160 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13170 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
13180 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f   if( rc ){.    O
13190 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
131a0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
131b0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
131c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
131d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
131e0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
131f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13200 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
13210 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66  OSTRACE(("SYNC f
13220 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13230 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22  E_IOERR_FSYNC\n"
13240 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13250 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
13260 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
13270 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  R_FSYNC, pFile->
13280 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132a0 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69    "winSync", pFi
132b0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
132c0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
132d0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
132e0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
132f0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
13300 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
13310 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
13320 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
13330 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
13340 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
13350 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
13360 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13370 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
13380 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
13390 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
133a0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
133b0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
133c0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
133d0 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
133e0 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
133f0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
13400 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
13410 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
13420 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
13430 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
13440 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
13450 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
13460 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
13470 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
13480 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
134b0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
134c0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
134d0 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
134e0 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
134f0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
13500 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13510 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
13520 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
13530 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
13540 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
13550 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
13580 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
13590 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
135a0 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
135b0 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
135c0 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
135d0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
135e0 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
135f0 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
13600 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
13610 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
13620 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
13630 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
13640 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
13650 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
13660 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
13670 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
13680 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
13690 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
136a0 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
136b0 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
136c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
136d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
136e0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
136f0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
13700 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
13710 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13730 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
13740 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
13750 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
13760 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
13770 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
13780 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
13790 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
137a0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
137b0 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
137c0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
137d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
137e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
137f0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
13800 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
13810 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
13820 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
13830 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
13840 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
13850 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
13860 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
13870 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
13880 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
13890 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
138a0 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
138b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
138c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
138d0 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
138e0 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
138f0 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
13900 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
13910 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
13920 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
13930 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
13940 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
13950 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
13960 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
13970 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
13980 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
13990 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
139a0 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
139b0 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
139c0 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
139d0 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
139e0 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
139f0 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
13a00 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
13a10 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
13a20 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
13a30 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
13a40 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
13a50 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
13a60 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
13a70 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
13a80 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
13a90 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
13aa0 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
13ad0 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
13ae0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13af0 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
13b00 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
13b10 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
13b20 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
13b30 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
13b40 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
13b50 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
13b60 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
13b70 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
13b80 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
13b90 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
13ba0 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
13bb0 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
13bc0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
13bd0 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
13be0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
13bf0 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
13c00 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
13c10 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
13c20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
13c30 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
13c40 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
13c50 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
13c60 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c   int winGetReadL
13c70 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
13c80 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
13c90 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
13ca0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
13cb0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
13cc0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
13cd0 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
13ce0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
13cf0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13d00 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
13d10 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
13d20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
13d30 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
13d40 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
13d50 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
13d60 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
13d70 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
13d80 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
13d90 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
13da0 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
13db0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
13dc0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
13dd0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
13de0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
13df0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13e00 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
13e10 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
13e20 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
13e30 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
13e40 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
13e50 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
13e60 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
13e70 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
13e80 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
13e90 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
13ea0 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
13eb0 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
13ec0 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
13ed0 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
13ee0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
13ef0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
13f00 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
13f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
13f30 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
13f40 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
13f50 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
13f60 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
13f70 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
13f80 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13f90 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
13fa0 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
13fb0 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
13fc0 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
13fd0 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
13fe0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
13ff0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
14000 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29  ite3ErrName(res)
14010 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
14020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
14030 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
14040 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
14050 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
14060 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
14070 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c  t res;.  DWORD l
14080 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52  astErrno;.  OSTR
14090 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
140a0 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
140b0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
140c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
140d0 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  ));.  if( osIsNT
140e0 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
140f0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
14100 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
14110 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
14120 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23  _SIZE, 0);.  }.#
14130 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
14140 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
14150 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
14160 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
14170 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
14180 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
14190 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
141a0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
141b0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
141c0 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
141d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
141e0 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45  =ERROR_NOT_LOCKE
141f0 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  D) ){.    pFile-
14200 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14210 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
14220 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14230 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69  OERR_UNLOCK, pFi
14240 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14260 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
14270 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
14280 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
14290 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
142a0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
142b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
142c0 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
142d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
142e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
142f0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
14300 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
14310 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
14320 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
14330 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
14340 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
14350 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
14360 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
14370 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
14380 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
14390 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
143a0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
143b0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
143c0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
143d0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
143e0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
143f0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
14400 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
14410 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
14420 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
14430 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
14440 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
14450 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
14460 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
14470 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
14480 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
14490 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
144a0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
144b0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
144c0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
144d0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
144e0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
144f0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
14500 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
14510 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14520 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
14530 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
14540 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14550 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14560 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14570 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14580 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
14590 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
145a0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
145b0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
145c0 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
145d0 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
145e0 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
145f0 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
14600 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
14610 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
14620 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
14630 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
14640 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
14650 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
14660 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
14670 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
14680 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
14690 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
146a0 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
146b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
146c0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
146d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
146e0 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
146f0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
14700 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
14710 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
14720 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
14730 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63  of a Windows loc
14740 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
14750 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
14760 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
14770 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
14780 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
14790 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
147a0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
147b0 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
147c0 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
147d0 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
147e0 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
147f0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
14800 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
14810 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
14820 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ROR;..  assert( 
14830 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
14840 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25  CE(("LOCK file=%
14850 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
14860 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
14870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
14880 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
14890 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
148a0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
148b0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
148c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
148d0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
148e0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
148f0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
14900 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
14910 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
14920 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
14930 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
14940 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
14950 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
14960 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
14970 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
14980 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14990 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
149a0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
149b0 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72  -HELD file=%p, r
149c0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
149d0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
149e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
149f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
14a00 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
14a10 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
14a20 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
14a30 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
14a40 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
14a50 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
14a60 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
14a70 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
14a80 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
14a90 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
14aa0 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
14ab0 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
14ac0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
14ad0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
14ae0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
14af0 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
14b00 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
14b10 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
14b20 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
14b30 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
14b40 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
14b50 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
14b60 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
14b70 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
14b80 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
14b90 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
14ba0 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
14bb0 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
14bc0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
14bd0 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
14be0 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
14bf0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
14c00 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
14c10 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
14c20 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
14c30 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
14c40 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
14c50 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
14c60 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
14c70 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
14c80 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
14cc0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
14cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
14ce0 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
14cf0 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
14d00 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
14d10 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
14d20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
14d30 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
14d40 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
14d50 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
14d60 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
14d70 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
14d80 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
14d90 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
14da0 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
14db0 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
14dc0 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
14dd0 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
14de0 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
14df0 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
14e00 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
14e10 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
14e20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c       OSTRACE(("L
14e30 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c  OCK-PENDING-FAIL
14e40 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d   file=%p, count=
14e50 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
14e70 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69  le->h, cnt, sqli
14e80 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
14e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
14ea0 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
14eb0 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
14ec0 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
14ed0 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
14ee0 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
14ef0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
14f00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
14f10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
14f20 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
14f30 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
14f40 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
14f50 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
14f60 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
14f70 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
14f80 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
14f90 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b  = winGetReadLock
14fa0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
14fb0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
14fc0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  wLocktype = SHAR
14fd0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
14fe0 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
14ff0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15000 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
15010 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
15020 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
15030 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
15040 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
15050 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
15060 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
15070 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
15080 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
15090 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
150a0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
150b0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
150c0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
150d0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
150e0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
150f0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53  ewLocktype = RES
15100 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  ERVED_LOCK;.    
15110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
15120 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
15130 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
15140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
15150 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
15160 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
15170 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
15180 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
15190 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
151a0 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
151b0 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
151c0 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 0;.  }..  /
151d0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
151e0 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f  LUSIVE lock.  */
151f0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
15200 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15210 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
15220 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
15230 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  ktype>=SHARED_LO
15240 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
15250 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  winUnlockReadLoc
15260 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65  k(pFile);.    re
15270 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
15280 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
15290 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
152a0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
152b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
152c0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
152d0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
152e0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
152f0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
15300 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
15310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
15320 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
15330 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
15340 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b    winGetReadLock
15350 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
15360 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
15370 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
15380 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
15390 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
153a0 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
153b0 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
153c0 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
153d0 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
153e0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
153f0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
15400 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15410 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
15420 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
15430 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
15440 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
15450 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
15460 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15470 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
15480 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
15490 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
154a0 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
154b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
154c0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
154d0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
154e0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
154f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15500 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43  BUSY;.    OSTRAC
15510 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
15520 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64  le=%p, wanted=%d
15530 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  , got=%d\n",.   
15540 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15550 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65  >h, locktype, ne
15560 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d  wLocktype));.  }
15570 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
15580 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
15590 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
155a0 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  ("LOCK file=%p, 
155b0 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
155c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
155d0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
155e0 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
155f0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
15600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15610 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15620 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
15630 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
15640 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15650 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
15660 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
15670 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
15680 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15690 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
156a0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
156b0 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
156c0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
156d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
156e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
156f0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
15700 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
15710 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
15720 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
15730 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
15740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
15750 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
15760 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52  DLOCK; );.  OSTR
15770 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
15780 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
15790 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Out=%p\n", pFile
157a0 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ->h, pResOut));.
157b0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
157c0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
157d0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
157e0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
157f0 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  rc = 1;.    OSTR
15800 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
15810 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  CK file=%p, rc=%
15820 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46  d (local)\n", pF
15830 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20  ile->h, rc));.  
15840 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
15850 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
15860 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
15870 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52  CKFILEEX_FLAGS,R
15880 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
15890 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
158a0 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  rc ){.      winU
158b0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
158c0 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
158d0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
158e0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
158f0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
15900 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
15910 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 72 65 6d  e=%p, rc=%d (rem
15920 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ote)\n", pFile->
15930 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a  h, rc));.  }.  *
15940 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
15950 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
15960 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
15970 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
15980 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
15990 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
159a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
159b0 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
159c0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
159d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
159e0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
159f0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
15a00 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74   descriptor id t
15a10 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
15a20 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
15a30 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
15a40 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
15a50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
15a60 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
15a70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15a80 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
15a90 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
15aa0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
15ab0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
15ac0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
15ad0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ..**.** It is no
15ae0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
15af0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  his routine to f
15b00 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ail if the secon
15b10 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
15b20 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68   NO_LOCK.  If th
15b30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15b40 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  t is SHARED_LOCK
15b50 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
15b60 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75  ne.** might retu
15b70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
15b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15b90 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  inUnlock(sqlite3
15ba0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
15bb0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
15bc0 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  type;.  winFile 
15bd0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
15be0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
15bf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
15c00 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
15c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
15c20 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
15c30 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  CK );.  OSTRACE(
15c40 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
15c50 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
15c60 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
15c70 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15c80 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
15c90 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
15ca0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
15cb0 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65  cktype));.  type
15cc0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
15cd0 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
15ce0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
15cf0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
15d00 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
15d10 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
15d20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
15d30 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
15d40 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
15d50 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  & !winGetReadLoc
15d60 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  k(pFile) ){.    
15d70 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
15d80 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
15d90 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
15da0 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
15db0 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
15dc0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
15dd0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
15de0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
15df0 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65  ERR_UNLOCK, osGe
15e00 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
15e30 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
15e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
15e50 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
15e60 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
15e70 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
15e80 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
15e90 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
15ea0 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
15eb0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70  ==NO_LOCK && typ
15ec0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
15ed0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52  {.    winUnlockR
15ee0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
15ef0 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
15f00 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
15f10 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
15f20 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
15f30 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
15f40 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
15f50 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
15f60 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54  )locktype;.  OST
15f70 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69  RACE(("UNLOCK fi
15f80 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
15f90 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
15fa0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
15fb0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
15fc0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
15fd0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
15fe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
15ff0 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61  pArg is inititia
16000 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
16010 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
16020 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
16030 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
16040 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
16050 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
16060 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
16070 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
16080 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
16090 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
160a0 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
160b0 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
160c0 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
160d0 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65  tic void winMode
160e0 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  Bit(winFile *pFi
160f0 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
16100 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
16110 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
16120 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
16130 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
16140 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
16150 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
16160 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
16170 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
16180 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
16190 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
161a0 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
161b0 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64   }.}../* Forward
161c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
161d0 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
161e0 73 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  s used for tempo
161f0 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74  rary files */.st
16200 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
16210 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
16220 76 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b  vfs *, char **);
16230 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
16240 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
16250 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  *);.static BOOL 
16260 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
16270 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63  AndColon(const c
16280 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  har *);../*.** C
16290 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
162a0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
162b0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
162c0 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43  tic int winFileC
162d0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
162e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
162f0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
16300 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
16310 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
16320 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
16330 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c   file=%p, op=%d,
16340 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69   pArg=%p\n", pFi
16350 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29  le->h, op, pArg)
16360 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
16370 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
16380 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
16390 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
163a0 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
163b0 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  >locktype;.     
163c0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
163d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
163e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
163f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
16400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16410 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
16420 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
16430 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
16440 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c  pArg = (int)pFil
16450 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
16460 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
16470 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
16480 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
16490 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
164a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
164b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
164c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
164d0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
164e0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
164f0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
16500 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16510 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16520 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16530 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16550 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
16560 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
16570 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
16580 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
16590 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
165a0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
165b0 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
165c0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
165d0 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
165e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
165f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16610 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
16620 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
16630 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
16640 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
16650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16660 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16670 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
16680 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
16690 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
166a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
166b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
166c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
166d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
166e0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
166f0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16700 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
16710 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
16720 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
16730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16740 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
16750 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
16760 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
16770 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
16780 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
167a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
167b0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
167c0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
167d0 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
167e0 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
167f0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
16800 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
16810 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
16820 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
16830 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
16840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16860 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
16870 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
16880 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
16890 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
168a0 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
168b0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
168c0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
168d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
168e0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
168f0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
16900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16910 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
16920 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
16930 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
16940 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
16950 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22  _mprintf("win32"
16960 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
16970 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
16980 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
16990 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
169a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
169b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
169c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
169d0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
169e0 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
169f0 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
16a00 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
16a10 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
16a20 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
16a30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16a40 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
16a50 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  nIoerrRetry;.   
16a60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
16a70 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
16a80 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
16a90 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
16aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16ab0 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[1] = winIoerr
16ac0 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20  RetryDelay;.    
16ad0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
16ae0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
16af0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
16b00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
16b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16b20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16b30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
16b40 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
16b50 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
16b60 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  zTFile = 0;.    
16b70 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65    int rc = winGe
16b80 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
16b90 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b  >pVfs, &zTFile);
16ba0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16bc0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
16bd0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
16be0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
16bf0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
16c00 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
16c10 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
16c20 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
16c30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16c40 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
16c50 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
16c60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
16c70 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
16c80 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
16c90 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
16ca0 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
16cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16cc0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
16cd0 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
16ce0 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
16cf0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
16d00 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
16d10 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
16d20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
16d30 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
16d40 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
16d50 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
16d60 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
16d70 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
16d80 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
16d90 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
16da0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
16db0 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
16dc0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
16dd0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
16de0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
16df0 28 76 6f 69 64 29 77 69 6e 55 6e 6d 61 70 66 69  (void)winUnmapfi
16e00 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
16e10 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70       rc = winMap
16e20 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b  file(pFile, -1);
16e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16e40 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
16e50 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
16e60 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
16e70 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
16e80 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
16e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16ea0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
16eb0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
16ec0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16ed0 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20  TE_NOTFOUND\n", 
16ee0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
16ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
16f00 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
16f10 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
16f20 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
16f30 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
16f40 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
16f50 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
16f60 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
16f70 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
16f80 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
16f90 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
16fa0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
16fb0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
16fc0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
16fd0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
16fe0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
16ff0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
17000 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
17010 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
17020 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
17030 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
17040 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
17050 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17060 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
17070 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
17080 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
17090 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
170a0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
170b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
170c0 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
170d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
170e0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
170f0 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
17100 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
17110 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
17120 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
17130 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
17140 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
17150 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17160 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
17170 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
17180 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17190 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
171a0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
171b0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
171c0 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
171d0 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
171e0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
171f0 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f  ERWRITE:0);.}../
17200 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  * .** Windows wi
17210 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
17220 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
17230 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
17240 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
17250 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
17260 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
17270 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
17280 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
17290 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
172a0 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
172b0 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53  arity size..*/.S
172c0 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
172d0 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20  sInfo;..#ifndef 
172e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
172f0 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
17300 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
17310 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
17320 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
17330 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
17340 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
17350 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
17360 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
17370 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  s used by .** th
17380 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
17390 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
173a0 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
173b0 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
173c0 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
173d0 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
173e0 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
173f0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
17400 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
17410 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
17420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17430 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
17440 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
17450 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
17460 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
17470 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
17480 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
17490 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
174a0 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
174b0 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
174c0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
174d0 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
174e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
174f0 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
17500 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
17510 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
17520 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
17530 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
17540 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
17550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17560 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
17570 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
17580 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
17590 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
175a0 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
175b0 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
175c0 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
175d0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
175e0 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
175f0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
17600 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
17610 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
17620 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
17630 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
17640 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
17650 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
17660 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
17670 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
17680 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
17690 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
176a0 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
176b0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
176c0 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
176d0 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
176e0 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
176f0 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
17700 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
17710 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
17720 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
17730 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
17740 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
17750 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
17760 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
17770 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
17780 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
17790 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
177a0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
177b0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
177c0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
177d0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
177e0 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
177f0 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
17800 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pNext .**.** The
17810 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
17820 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
17830 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
17840 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
17850 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
17860 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
17870 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53  *.** Either winS
17880 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
17890 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e  t be held or win
178a0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
178b0 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  and.** winShmMut
178c0 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
178d0 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
178e0 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
178f0 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
17900 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
17910 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  *.*/.struct winS
17920 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74  hmNode {.  sqlit
17930 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
17940 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
17950 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
17960 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
17970 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
17980 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17990 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  the file */.  wi
179a0 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20  nFile hFile;    
179b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
179c0 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e   handle from win
179d0 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73  Open */..  int s
179e0 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
179f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17a00 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
17a10 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
17a20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
17a30 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17a40 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
17a50 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d   */.  struct Shm
17a60 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e  Region {.    HAN
17a70 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
17a80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
17a90 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65  ndle from Create
17aa0 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20  FileMapping */. 
17ab0 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20     void *pMap;. 
17ac0 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44   } *aRegion;.  D
17ad0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
17ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17af0 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
17b00 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
17b10 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74   error */..  int
17b20 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
17b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17b40 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65  r of winShm obje
17b50 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
17b60 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
17b70 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
17b80 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53       /* All winS
17b90 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
17ba0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
17bb0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
17bc0 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  xt;         /* N
17bd0 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  ext in list of a
17be0 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
17bf0 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  jects */.#ifdef 
17c00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
17c10 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
17c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
17c30 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53  t available winS
17c40 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
17c50 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
17c60 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f  A global array o
17c70 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
17c80 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
17c90 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  The winShmMutexH
17ca0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
17cb0 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ue while reading
17cc0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73   or writing this
17cd0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
17ce0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e   winShmNode *win
17cf0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b  ShmNodeList = 0;
17d00 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
17d10 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
17d20 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
17d30 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
17d40 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
17d50 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
17d60 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
17d70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
17d80 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
17d90 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
17da0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
17db0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
17dc0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
17dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68  :.**.**    winSh
17de0 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20  m.pShmNode.**   
17df0 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a   winShm.id.**.**
17e00 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
17e10 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
17e20 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53  .  The winShm.pS
17e30 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75  hmNode->mutex mu
17e40 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
17e50 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
17e60 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
17e70 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  lds..*/.struct w
17e80 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d  inShm {.  winShm
17e90 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
17ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
17eb0 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  rlying winShmNod
17ec0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69  e object */.  wi
17ed0 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  nShm *pNext;    
17ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
17ef0 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65   winShm with the
17f00 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65   same winShmNode
17f10 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
17f20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
17f30 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
17f40 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  ing the winShmNo
17f50 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
17f60 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
17f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
17f80 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
17f90 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
17fa0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
17fb0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
17fc0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
17fd0 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
17fe0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
17ff0 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
18000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
18010 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
18020 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
18030 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
18040 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
18050 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
18060 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
18070 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
18080 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
18090 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
180a0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
180b0 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
180c0 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
180d0 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
180e0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
180f0 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
18100 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
18110 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
18120 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
18130 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
18140 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
18150 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
18160 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
18170 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
18180 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
18190 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
181a0 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
181b0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
181c0 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
181d0 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
181e0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
181f0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
18200 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
18210 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
18220 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
18230 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
18240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18250 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
18260 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
18270 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
18280 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
18290 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
182a0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
182b0 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
182c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
182d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
182e0 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
182f0 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
18300 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
18310 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
18320 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
18330 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
18340 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
18350 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18360 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
18370 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
18380 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54  Ref==0 );..  OST
18390 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
183a0 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
183b0 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
183c0 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  e=%d\n",.       
183d0 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
183e0 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66  .h, lockType, of
183f0 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  st, nByte));..  
18400 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69  /* Release/Acqui
18410 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  re the system-le
18420 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  vel lock */.  if
18430 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d  ( lockType==_SHM
18440 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63  _UNLCK ){.    rc
18450 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
18460 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
18470 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
18480 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
18490 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
184a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
184b0 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44  ameters */.    D
184c0 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c  WORD dwFlags = L
184d0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
184e0 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66  EDIATELY;.    if
184f0 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53  ( lockType == _S
18500 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61  HM_WRLCK ) dwFla
18510 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
18520 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
18530 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46     rc = winLockF
18540 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
18550 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66  e.h, dwFlags, of
18560 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
18570 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  ;.  }.  .  if( r
18580 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
18590 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
185a0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
185b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
185c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
185d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
185e0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
185f0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
18600 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73  file=%p, func=%s
18610 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d  , errno=%lu, rc=
18620 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
18630 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
18640 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  , (lockType == _
18650 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69  SHM_UNLCK) ? "wi
18660 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20  nUnlockFile" :. 
18670 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f            "winLo
18680 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ckFile", pFile->
18690 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74  lastErrno, sqlit
186a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
186b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
186c0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
186d0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
186e0 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
186f0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
18700 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
18710 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
18720 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
18730 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
18740 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
18750 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
18760 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
18770 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
18780 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
18790 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
187a0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
187b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
187c0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
187d0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
187e0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
187f0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
18800 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
18810 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
18820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
18830 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
18840 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
18850 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
18860 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
18870 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
18880 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
18890 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
188a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
188b0 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c  M-PURGE pid=%lu,
188c0 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e   deleteFlag=%d\n
188d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
188e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
188f0 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61  sId(), deleteFla
18900 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  g));.  pp = &win
18910 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
18920 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
18930 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
18940 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
18950 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
18960 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71  f( p->mutex ) sq
18970 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
18980 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
18990 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
189a0 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
189b0 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20         BOOL bRc 
189c0 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  = osUnmapViewOfF
189d0 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  ile(p->aRegion[i
189e0 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].pMap);.       
189f0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
18a00 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25  URGE-UNMAP pid=%
18a10 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72  lu, region=%d, r
18a20 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
18a30 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
18a40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
18a50 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22  ), i, bRc ? "ok"
18a60 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
18a70 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41         UNUSED_VA
18a80 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63  RIABLE_VALUE(bRc
18a90 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
18aa0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
18ab0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
18ac0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
18ad0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
18ae0 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72  CLOSE pid=%lu, r
18af0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
18b00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
18b10 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
18b20 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
18b30 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
18b40 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
18b50 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
18b60 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
18b70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18b80 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c  p->hFile.h!=NULL
18b90 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d   && p->hFile.h!=
18ba0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
18bb0 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ALUE ){.        
18bc0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18bd0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18be0 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
18bf0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
18c00 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53  File);.        S
18c10 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18c20 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
18c30 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74  .      if( delet
18c40 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
18c50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18c60 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
18c70 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
18c80 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
18c90 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65         winDelete
18ca0 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
18cb0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
18cc0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
18cd0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
18ce0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18cf0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
18d00 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
18d10 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
18d20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
18d30 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  >aRegion);.     
18d40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
18d50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18d60 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
18d70 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
18d80 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
18d90 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
18da0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
18db0 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
18dc0 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pDbFd..**.** Whe
18dd0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
18de0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
18df0 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
18e00 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
18e10 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
18e20 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
18e30 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
18e40 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
18e50 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
18e60 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
18e70 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
18e80 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
18e90 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
18ea0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18eb0 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
18ec0 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44  mory(winFile *pD
18ed0 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77  bFd){.  struct w
18ee0 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
18ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18f00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
18f10 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
18f20 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
18f30 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20   *pShmNode = 0; 
18f40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
18f50 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
18f60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
18f90 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72  lt code */.  str
18fa0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
18fb0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
18fc0 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
18fd0 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ed winShmNode */
18fe0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19010 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
19020 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
19030 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20  bFd->pShm==0 ); 
19040 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f     /* Not previo
19050 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a  usly opened */..
19060 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
19070 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
19080 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
19090 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c  ct.  Also specul
190a0 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c  atively.  ** all
190b0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
190c0 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65  a new winShmNode
190d0 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20   and filename.. 
190e0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
190f0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
19100 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
19110 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
19120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
19130 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  M;.  nName = sql
19140 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
19150 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
19160 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
19170 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
19180 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
19190 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
191a0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
191b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
191c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
191d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
191e0 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65   }.  pNew->zFile
191f0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
19200 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
19210 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
19220 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
19230 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
19240 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
19250 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
19260 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
19270 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
19280 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  e); ..  /* Look 
19290 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
192a0 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
192b0 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
192c0 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
192d0 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
192e0 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
192f0 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
19300 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
19310 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
19320 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
19330 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
19340 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
19350 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
19360 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
19370 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
19380 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
19390 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
193a0 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
193b0 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
193c0 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
193d0 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
193e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
193f0 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
19400 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
19410 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
19420 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
19430 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
19440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19450 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
19460 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
19470 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
19480 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
19490 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
194a0 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
194b0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
194c0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
194d0 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
194e0 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
194f0 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
19500 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
19510 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
19520 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
19530 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
19540 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
19550 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
19560 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19570 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
19580 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
19590 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
195a0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
195b0 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20  n(pDbFd->pVfs,. 
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
195e0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
195f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19600 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19620 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
19630 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
19640 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ,  /* File handl
19650 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20  e here */.      
19660 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19670 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c  E_OPEN_WAL | SQL
19680 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19690 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
196a0 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20  _CREATE,.       
196b0 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
196c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
196d0 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  =rc ){.      got
196e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
196f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
19700 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
19710 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
19720 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
19730 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
19740 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
19750 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
19760 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
19770 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77      */.    if( w
19780 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
19790 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
197a0 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  RLCK, WIN_SHM_DM
197b0 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
197c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
197d0 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
197e0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
197f0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b  Node->hFile, 0);
19800 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19820 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
19830 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
19840 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
19850 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68        "winOpenSh
19880 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
19890 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
198a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
198b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
198c0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
198d0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
198e0 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
198f0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  MS, 1);.      rc
19900 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
19910 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
19920 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
19930 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d  M_DMS, 1);.    }
19940 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
19950 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
19960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
19970 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
19980 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
19990 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
199a0 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
199b0 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
199c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
199d0 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
199e0 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
199f0 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
19a00 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
19a10 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77  d->pShm = p;.  w
19a20 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
19a30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
19a40 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
19a50 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
19a60 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
19a70 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
19a80 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
19a90 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  e winShmEnterMut
19aa0 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
19ab0 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
19ac0 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
19ad0 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a  ruct winShm) obj
19ae0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
19af0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
19b00 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
19b10 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
19b20 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
19b30 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
19b40 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
19b50 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
19b60 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
19b70 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
19b80 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
19b90 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
19ba0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
19bb0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
19bc0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
19bd0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
19be0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
19bf0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
19c00 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
19c10 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
19c20 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
19c30 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
19c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19c50 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
19c60 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
19c70 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
19c80 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
19c90 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
19ca0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
19cb0 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68  DMS, 1);.  winSh
19cc0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
19cd0 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20  fs, 0);      /* 
19ce0 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
19cf0 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
19d00 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
19d10 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
19d20 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
19d30 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
19d40 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
19d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
19d60 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
19d70 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
19d80 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
19d90 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
19da0 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
19db0 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ag is true..*/.s
19dc0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
19dd0 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
19de0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
19df0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19e00 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
19e10 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64  emory */.  int d
19e20 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
19e30 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
19e40 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66  after closing if
19e50 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69   true */.){.  wi
19e60 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  nFile *pDbFd;   
19e70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19e80 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d  holding shared-m
19e90 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
19ea0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
19eb0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
19ec0 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
19ed0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
19ee0 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68  *pShmNode; /* Th
19ef0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
19f00 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
19f10 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70  */.  winShm **pp
19f20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
19f30 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
19f40 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
19f50 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  ns */..  pDbFd =
19f60 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
19f70 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
19f80 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
19f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19fa0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
19fb0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a  >pShmNode;..  /*
19fc0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
19fd0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
19fe0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
19ff0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
1a000 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
1a010 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1a020 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1a030 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
1a040 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
1a050 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
1a060 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
1a070 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
1a080 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
1a090 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
1a0a0 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
1a0b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
1a0c0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
1a0d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1a0e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1a0f0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
1a100 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
1a110 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
1a120 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
1a130 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
1a140 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
1a150 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  oo */.  winShmEn
1a160 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
1a170 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
1a180 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
1a190 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
1a1a0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1a1b0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  ef==0 ){.    win
1a1c0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
1a1d0 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67  pVfs, deleteFlag
1a1e0 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c  );.  }.  winShmL
1a1f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1a200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
1a220 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
1a230 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
1a240 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  mory segment..*/
1a250 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1a260 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
1a270 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1a280 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1a290 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
1a2a0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1a2b0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
1a2e0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
1a2f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a320 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
1a330 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1a340 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a360 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
1a370 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
1a380 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1a390 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1a3a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1a3b0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
1a3c0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1a3d0 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
1a3e0 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
1a3f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
1a400 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
1a410 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e   locked */.  win
1a420 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1a450 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
1a460 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  ngs */.  winShmN
1a470 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1a480 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  p->pShmNode;.  i
1a490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a4a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
1a4b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a4c0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
1a4d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a4f0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1a500 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
1a510 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
1a520 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
1a530 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
1a540 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1a550 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
1a560 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
1a570 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1a580 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1a590 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1a5a0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
1a5b0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1a5c0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
1a5d0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1a5e0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
1a5f0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1a600 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1a610 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1a620 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1a630 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
1a640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
1a650 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
1a660 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1a670 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  VE)!=0 );..  mas
1a680 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28  k = (u16)((1U<<(
1a690 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c  ofst+n)) - (1U<<
1a6a0 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74  ofst));.  assert
1a6b0 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
1a6c0 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
1a6d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1a6e0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1a6f0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
1a700 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
1a710 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
1a720 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
1a730 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
1a740 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
1a750 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
1a760 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
1a770 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
1a780 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1a790 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1a7a0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1a7b0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
1a7c0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
1a7d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1a7e0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
1a7f0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
1a800 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
1a810 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
1a820 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1a830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a840 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
1a850 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
1a860 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
1a870 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
1a880 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1a890 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1a8a0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1a8b0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1a8c0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ASE, n);.    }el
1a8d0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1a8e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1a8f0 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  .    /* Undo the
1a900 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
1a910 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1a930 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1a940 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ask;.      p->sh
1a950 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
1a960 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73  k;.    } .  }els
1a970 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
1a980 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20  LITE_SHM_SHARED 
1a990 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68  ){.    u16 allSh
1a9a0 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e  ared = 0;  /* Un
1a9b0 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ion of locks hel
1a9c0 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
1a9d0 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20   other than "p" 
1a9e0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  */..    /* Find 
1a9f0 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64  out which shared
1aa00 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61   locks are alrea
1aa10 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  dy held by sibli
1aa20 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  ng connections..
1aa30 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69      ** If any si
1aa40 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
1aa50 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
1aa60 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
1aa70 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
1aa80 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  * SQLITE_BUSY.. 
1aa90 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
1aaa0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
1aab0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
1aac0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1aad0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1aae0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
1aaf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ab00 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
1ab10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ab20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20     allShared |= 
1ab30 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
1ab40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1ab50 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  t shared locks a
1ab60 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
1ab70 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  el, if necessary
1ab80 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1ab90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aba0 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65     if( (allShare
1abb0 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  d & mask)==0 ){.
1abc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1abd0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1abe0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
1abf0 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
1ac00 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
1ac10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ac20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ac30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ac40 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
1ac50 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
1ac60 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1ac70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ac80 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
1ac90 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
1aca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1acb0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
1acc0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1acd0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
1ace0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
1acf0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
1ad00 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
1ad10 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
1ad20 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
1ad30 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1ad40 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1ad50 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1ad60 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1ad70 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1ad80 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
1ad90 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
1ada0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1adb0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1adc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1add0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1ade0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
1adf0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
1ae00 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1ae10 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
1ae20 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
1ae30 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
1ae40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
1ae50 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
1ae60 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1ae70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae80 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1ae90 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1aea0 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f  e, _SHM_WRLCK, o
1aeb0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1aec0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
1aed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1aee0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1aef0 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
1af00 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
1af10 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
1af20 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1af30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
1af40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1af50 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1af60 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
1af70 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c  "SHM-LOCK pid=%l
1af80 75 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64  u, id=%d, shared
1af90 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d  Mask=%03x, exclM
1afa0 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c  ask=%03x, rc=%s\
1afb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1afc0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1afd0 73 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70  ssId(), p->id, p
1afe0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
1aff0 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20  >exclMask,.     
1b000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b010 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
1b020 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b030 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
1b040 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
1b050 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
1b060 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
1b070 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
1b080 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
1b090 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
1b0a0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
1b0b0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
1b0c0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
1b0d0 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
1b0e0 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
1b0f0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72  c void winShmBar
1b100 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
1b110 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
1b120 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1b130 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
1b140 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1b150 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b160 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72  (fd);.  /* Memor
1b170 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64  yBarrier(); // d
1b180 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20  oes not work -- 
1b190 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20  do not know why 
1b1a0 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  not */.  winShmE
1b1b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77  nterMutex();.  w
1b1c0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1b1d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1b1e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1b1f0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
1b200 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
1b210 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
1b220 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f   .** shared-memo
1b230 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
1b240 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1b250 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
1b260 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a  memory regions .
1b270 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
1b280 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
1b290 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
1b2a0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
1b2b0 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79   szRegion .** by
1b2c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
1b2d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1b2e0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1b2f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b300 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
1b310 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
1b320 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1b330 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74   isWrite paramet
1b340 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
1b350 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1b360 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
1b370 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
1b380 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
1b390 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
1b3a0 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
1b3b0 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
1b3c0 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
1b3d0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1b3e0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1b3f0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a  returned. If .**
1b400 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1b410 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
1b420 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1b430 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1b440 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e  not yet .** been
1b450 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
1b460 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
1b470 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1b480 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
1b490 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1b4a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b4b0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
1b4c0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
1b4d0 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
1b4e0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
1b4f0 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
1b500 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1b510 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73  sses .** address
1b520 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
1b530 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
1b540 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
1b550 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
1b560 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
1b570 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b580 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b590 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73  t winShmMap(.  s
1b5a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5c0 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
1b5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1b5e0 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
1b610 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
1b620 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b640 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
1b650 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69  s */.  int isWri
1b660 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1b670 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
1b680 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
1b690 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1b6a0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
1b6b0 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
1b6c0 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
1b6d0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69  emory */.){.  wi
1b6e0 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
1b6f0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77  winFile*)fd;.  w
1b700 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
1b710 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d  ->pShm;.  winShm
1b720 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
1b730 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b740 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20  E_OK;..  if( !p 
1b750 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  ){.    rc = winO
1b760 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1b770 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
1b780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1b7a0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1b7b0 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d    }.  pShmNode =
1b7c0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
1b7d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1b7e0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1b7f0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
1b800 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
1b810 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
1b820 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1b830 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  on==0 );..  if( 
1b840 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1b850 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
1b860 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
1b870 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  on *apNew;      
1b880 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67       /* New aReg
1b890 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
1b8a0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
1b8b0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67  iRegion+1)*szReg
1b8c0 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  ion;  /* Minimum
1b8d0 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
1b8e0 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ize */.    sqlit
1b8f0 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20  e3_int64 sz;    
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b910 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
1b920 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
1b930 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
1b940 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
1b950 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54  egion;..    /* T
1b960 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
1b970 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
1b980 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
1b990 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1b9a0 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63  ace..    ** Chec
1b9b0 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
1b9c0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1b9d0 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
1b9e0 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
1b9f0 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e  .    ** large en
1ba00 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
1ba10 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
1ba20 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  gion)..    */.  
1ba30 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69    rc = winFileSi
1ba40 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ze((sqlite3_file
1ba50 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1ba60 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69  ile, &sz);.    i
1ba70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ba80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1ba90 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1baa0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1bab0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1bac0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1bad0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1bae0 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap1", pDbFd->z
1baf0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74  Path);.      got
1bb00 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1bb10 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a     }..    if( sz
1bb20 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
1bb30 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1bb40 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
1bb50 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
1bb60 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74  f isWrite is set
1bb70 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   to.      ** zer
1bb80 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  o, exit early. *
1bb90 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
1bba0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
1bbb0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
1bbc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1bbd0 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
1bbe0 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  if isWrite is no
1bbf0 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75  n-zero, use ftru
1bc00 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
1bc10 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
1bc20 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1bc30 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
1bc40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
1bc50 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d  Write ) goto shm
1bc60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1bc70 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
1bc80 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1bc90 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1bca0 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  e, nByte);.     
1bcb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bcc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1bcd0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1bce0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1bcf0 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
1bd00 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44  "winShmMap2", pD
1bd30 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1bd40 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1bd50 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
1bd60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
1bd70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
1bd80 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
1bd90 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1bda0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
1bdb0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
1bdc0 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
1bdd0 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
1bde0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
1bdf0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
1be00 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1be10 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
1be20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
1be30 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
1be40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1be50 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1be60 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1be70 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
1be80 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  aRegion = apNew;
1be90 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ..    while( pSh
1bea0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1beb0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  iRegion ){.     
1bec0 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e   HANDLE hMap = N
1bed0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ULL;         /* 
1bee0 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e  file-mapping han
1bef0 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  dle */.      voi
1bf00 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20  d *pMap = 0;    
1bf10 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
1bf20 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1bf30 20 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51   */.     .#if SQ
1bf40 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1bf50 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1bf60 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
1bf70 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  omApp(pShmNode->
1bf80 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
1bf90 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1bfa0 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20  ADWRITE, nByte, 
1bfb0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1bfc0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1bfd0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1bfe0 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  E).      hMap = 
1bff0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1c000 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingW(pShmNode->h
1c010 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20  File.h, .       
1c020 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1c030 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74  ADWRITE, 0, nByt
1c040 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1c050 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1c060 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1c070 41 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70  ANSI).      hMap
1c080 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1c090 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65  appingA(pShmNode
1c0a0 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20  ->hFile.h, .    
1c0b0 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
1c0c0 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e  _READWRITE, 0, n
1c0d0 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20  Byte, NULL.     
1c0e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   );.#endif.     
1c0f0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
1c100 41 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c  AP-CREATE pid=%l
1c110 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69  u, region=%d, si
1c120 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ze=%d, rc=%s\n",
1c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c140 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1c150 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
1c160 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74  e->nRegion, nByt
1c170 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1c180 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20    hMap ? "ok" : 
1c190 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1c1a0 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20    if( hMap ){.  
1c1b0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
1c1c0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  t = pShmNode->nR
1c1d0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
1c1e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
1c1f0 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
1c200 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
1c210 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
1c220 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c  ularity;.#if SQL
1c230 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1c240 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
1c250 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1c260 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  pp(hMap, FILE_MA
1c270 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
1c280 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
1c290 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69       iOffset - i
1c2a0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
1c2b0 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
1c2c0 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
1c2d0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d  #else.        pM
1c2e0 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
1c2f0 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f  File(hMap, FILE_
1c300 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
1c310 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
1c320 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65         0, iOffse
1c330 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
1c340 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
1c350 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
1c360 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
1c370 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1c380 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c  M-MAP-MAP pid=%l
1c390 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66  u, region=%d, of
1c3a0 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64  fset=%d, size=%d
1c3b0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1c3d0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1c3e0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
1c3f0 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74  nRegion, iOffset
1c400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c410 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61     szRegion, pMa
1c420 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
1c430 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
1c440 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29       if( !pMap )
1c450 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
1c460 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  de->lastErrno = 
1c470 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1c480 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1c490 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1c4a0 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
1c4b0 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
1c4c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1c4e0 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46  inShmMap3", pDbF
1c4f0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1c500 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73     if( hMap ) os
1c510 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70  CloseHandle(hMap
1c520 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1c530 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1c540 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d     }..      pShm
1c550 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
1c560 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
1c570 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  .pMap = pMap;.  
1c580 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1c590 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1c5a0 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20  nRegion].hMap = 
1c5b0 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  hMap;.      pShm
1c5c0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
1c5d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
1c5e0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
1c5f0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1c600 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
1c610 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52  int iOffset = iR
1c620 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
1c630 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1c640 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1c650 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1c660 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1c670 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ity;.    char *p
1c680 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e   = (char *)pShmN
1c690 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65  ode->aRegion[iRe
1c6a0 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20  gion].pMap;.    
1c6b0 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  *pp = (void *)&p
1c6c0 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a  [iOffsetShift];.
1c6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
1c6e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1c6f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c700 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1c710 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c720 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
1c730 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30   winShmMap     0
1c740 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1c750 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69  Lock    0.# defi
1c760 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  ne winShmBarrier
1c770 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
1c780 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
1c790 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
1c7a0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
1c7b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75  ../*.** Cleans u
1c7c0 70 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67  p the mapped reg
1c7d0 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
1c7e0 66 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e  fied file, if an
1c7f0 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
1c800 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1c810 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
1c820 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nmapfile(winFile
1c830 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65   *pFile){.  asse
1c840 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
1c850 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1c860 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1c870 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25  pFile=%p, hMap=%
1c880 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
1c890 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
1c8a0 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d  mmapSize=%lld, m
1c8b0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c  mapSizeActual=%l
1c8c0 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d  ld, mmapSizeMax=
1c8d0 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %lld\n",.       
1c8e0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1c8f0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1c900 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c  le, pFile->hMap,
1c910 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1c920 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  on,.           p
1c930 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20  File->mmapSize, 
1c940 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
1c950 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d  ctual, pFile->mm
1c960 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69  apSizeMax));.  i
1c970 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  f( pFile->pMapRe
1c980 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  gion ){.    if( 
1c990 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  !osUnmapViewOfFi
1c9a0 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  le(pFile->pMapRe
1c9b0 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70  gion) ){.      p
1c9c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1c9d0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1c9e0 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
1c9f0 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1ca00 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1ca10 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c  , pMapRegion=%p,
1ca20 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1ca30 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45    "rc=SQLITE_IOE
1ca40 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65  RR_MMAP\n", osGe
1ca50 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ca60 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20  d(), pFile,.    
1ca70 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1ca80 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a  ->pMapRegion));.
1ca90 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
1caa0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1cab0 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
1cac0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
1caf0 66 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  file1", pFile->z
1cb00 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
1cb10 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1cb20 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  on = 0;.    pFil
1cb30 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
1cb40 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
1cb50 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
1cb60 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
1cb70 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20  >hMap!=NULL ){. 
1cb80 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48     if( !osCloseH
1cb90 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61  andle(pFile->hMa
1cba0 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  p) ){.      pFil
1cbb0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1cbc0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1cbd0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1cbe0 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  "UNMAP-FILE pid=
1cbf0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68  %lu, pFile=%p, h
1cc00 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  Map=%p, rc=SQLIT
1cc10 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
1cc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc30 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1cc40 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1cc50 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20  pFile->hMap));. 
1cc60 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
1cc70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1cc80 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65  OERR_MMAP, pFile
1cc90 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66        "winUnmapf
1ccc0 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ile2", pFile->zP
1ccd0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
1cce0 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
1ccf0 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  LL;.  }.  OSTRAC
1cd00 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1cd10 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1cd20 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1cd30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1cd40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1cd50 73 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a  sId(), pFile));.
1cd60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cd70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  OK;.}../*.** Mem
1cd80 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70  ory map or remap
1cd90 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1cda0 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70   by file-descrip
1cdb0 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20  tor pFd (if the 
1cdc0 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  file.** is alrea
1cdd0 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65  dy mapped, the e
1cde0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
1cdf0 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
1ce00 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20  he new). Or, if 
1ce10 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
1ce20 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
1ce30 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
1ce40 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
1ce50 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61  still .** outsta
1ce60 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72  nding xFetch() r
1ce70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c  eferences to it,
1ce80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ce90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1cea0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42   If parameter nB
1ceb0 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  yte is non-negat
1cec0 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ive, then it is 
1ced0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
1cee0 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61  ze of .** the ma
1cef0 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
1cf00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
1cf10 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
1cf20 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
1cf30 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73   .** requested s
1cf40 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
1cf50 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1cf60 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
1cf70 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
1cf80 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
1cf90 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
1cfa0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
1cfb0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
1cfc0 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51  red .** using SQ
1cfd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
1cfe0 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20  SIZE, whichever 
1cff0 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  is smaller..**.*
1d000 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d010 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
1d020 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e  ror occurs (even
1d030 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20   if the mapping 
1d040 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61  is not.** recrea
1d050 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  ted as a result 
1d060 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  of outstanding r
1d070 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e  eferences) or an
1d080 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
1d090 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1d0a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d0b0 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  inMapfile(winFil
1d0c0 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f  e *pFd, sqlite3_
1d0d0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
1d0e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d  sqlite3_int64 nM
1d0f0 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e  ap = nByte;.  in
1d100 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1d110 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
1d120 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
1d130 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50  .  OSTRACE(("MAP
1d140 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1d150 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  File=%p, size=%l
1d160 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
1d170 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1d180 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1d190 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20  nByte));..  if( 
1d1a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30  pFd->nFetchOut>0
1d1b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d1c0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70  _OK;..  if( nMap
1d1d0 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  <0 ){.    rc = w
1d1e0 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
1d1f0 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26  te3_file*)pFd, &
1d200 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72  nMap);.    if( r
1d210 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  c ){.      OSTRA
1d220 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
1d230 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d240 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
1d250 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20  _FSTAT\n",.     
1d260 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d270 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d280 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20  ), pFd));.      
1d290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d2a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
1d2b0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
1d2c0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
1d2d0 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
1d2e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
1d2f0 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e  .  }.  nMap &= ~
1d300 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1d310 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1d320 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20  eSize - 1);. .  
1d330 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70  if( nMap==0 && p
1d340 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  Fd->mmapSize>0 )
1d350 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  {.    winUnmapfi
1d360 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69  le(pFd);.  }.  i
1d370 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
1d380 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f  apSize ){.    vo
1d390 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  id *pNew = 0;.  
1d3a0 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20    DWORD protect 
1d3b0 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b  = PAGE_READONLY;
1d3c0 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73  .    DWORD flags
1d3d0 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   = FILE_MAP_READ
1d3e0 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ;..    winUnmapf
1d3f0 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66  ile(pFd);.    if
1d400 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
1d410 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  s & WINFILE_RDON
1d420 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1d430 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
1d440 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1d450 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41  flags |= FILE_MA
1d460 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23  P_WRITE;.    }.#
1d470 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1d480 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  RT.    pFd->hMap
1d490 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1d4a0 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46  appingFromApp(pF
1d4b0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1d4c0 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29  ect, nMap, NULL)
1d4d0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1d4e0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1d4f0 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e  _WIDE).    pFd->
1d500 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1d510 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d  ileMappingW(pFd-
1d520 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1d530 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1d560 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1d570 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1d5a0 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1d5b0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1d5c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1d5d0 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1d5e0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1d5f0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1d600 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  A(pFd->h, NULL, 
1d610 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1d640 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1d650 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1d680 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1d690 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1d6a0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64  ndif.    if( pFd
1d6b0 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap==NULL ){.
1d6c0 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1d6d0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1d6e0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
1d6f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1d700 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1d710 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
1d720 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1d730 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
1d740 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50  pfile1", pFd->zP
1d750 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
1d760 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
1d770 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
1d780 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
1d790 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
1d7a0 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
1d7b0 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54  ("MAP-FILE-CREAT
1d7c0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1d7d0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1d7f0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d800 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
1d810 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1d820 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d840 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61      assert( (nMa
1d850 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  p % winSysInfo.d
1d860 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b  wPageSize)==0 );
1d870 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
1d880 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a  eof(SIZE_T)==siz
1d890 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
1d8a0 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66  4) || nMap<=0xff
1d8b0 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51  ffffff );.#if SQ
1d8c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1d8d0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69    pNew = osMapVi
1d8e0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1d8f0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1d900 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
1d910 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p);.#else.    pN
1d920 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1d930 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20  File(pFd->hMap, 
1d940 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49  flags, 0, 0, (SI
1d950 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64  ZE_T)nMap);.#end
1d960 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  if.    if( pNew=
1d970 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f  =NULL ){.      o
1d980 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64  sCloseHandle(pFd
1d990 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70  ->hMap);.      p
1d9a0 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  Fd->hMap = NULL;
1d9b0 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74  .      pFd->last
1d9c0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1d9d0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1d9e0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1d9f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1da00 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72  AP, pFd->lastErr
1da10 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1da20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d             "winM
1da30 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a  apfile2", pFd->z
1da40 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Path);.      /* 
1da50 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62  Log the error, b
1da60 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d  ut continue norm
1da70 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69  al operation usi
1da80 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
1da90 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
1daa0 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20  (("MAP-FILE-MAP 
1dab0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1dac0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1dae0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1daf0 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
1db00 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1db10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1db20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1db30 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
1db40 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46  n = pNew;.    pF
1db50 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d  d->mmapSize = nM
1db60 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ap;.    pFd->mma
1db70 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d  pSizeActual = nM
1db80 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  ap;.  }..  OSTRA
1db90 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
1dba0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1dbb0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1dbc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1dbd0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1dbe0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72  Id(), pFd));.  r
1dbf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dc00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1dc10 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1dc20 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  E>0 */../*.** If
1dc30 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72   possible, retur
1dc40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1dc50 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65   mapping of file
1dc60 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20   fd starting at 
1dc70 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20  offset.** iOff. 
1dc80 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  The mapping must
1dc90 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74   be valid for at
1dca0 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65   least nAmt byte
1dcb0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  s..**.** If such
1dcc0 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62   a pointer can b
1dcd0 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72  e obtained, stor
1dce0 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20  e it in *pp and 
1dcf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dd00 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20  ..** Or, if one 
1dd10 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72  cannot but no er
1dd20 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1dd30 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74  *pp to 0 and ret
1dd40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1dd50 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e  * Finally, if an
1dd60 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
1dd70 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  r, return an SQL
1dd80 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1dd90 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c  The final.** val
1dda0 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64  ue of *pp is und
1ddb0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
1ddc0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
1ddd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
1dde0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1ddf0 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  r, the caller mu
1de00 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a  st eventually .*
1de10 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65  * release the re
1de20 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69  ference by calli
1de30 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e  ng winUnfetch().
1de40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1de50 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  inFetch(sqlite3_
1de60 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
1de70 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
1de80 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51  id **pp){.#if SQ
1de90 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1dea0 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
1deb0 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
1dec0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
1ded0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
1dee0 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
1def0 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53    *pp = 0;..  OS
1df00 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
1df10 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1df20 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d   offset=%lld, am
1df30 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e  ount=%d, pp=%p\n
1df40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1df50 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1df60 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c  sId(), fd, iOff,
1df70 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69   nAmt, pp));..#i
1df80 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1df90 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
1dfa0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
1dfb0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
1dfc0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
1dfd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1dfe0 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64  = winMapfile(pFd
1dff0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
1e000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e010 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  {.        OSTRAC
1e020 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
1e030 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1e040 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e050 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e060 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e070 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1e080 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1e090 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e0a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e0b0 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
1e0c0 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20  ze >= iOff+nAmt 
1e0d0 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26  ){.      *pp = &
1e0e0 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
1e0f0 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20  Region)[iOff];. 
1e100 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68       pFd->nFetch
1e110 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out++;.    }.  }
1e120 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
1e130 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
1e140 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70  lu, pFile=%p, pp
1e150 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d  =%p, *pp=%p, rc=
1e160 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1e170 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e180 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e190 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b  , fd, pp, *pp));
1e1a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e1b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
1e1c0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
1e1d0 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ent is non-NULL,
1e1e0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e1f0 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a  ion releases a .
1e200 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
1e210 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
1e220 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
1e230 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
1e240 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
1e250 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1e260 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
1e270 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
1e280 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1e290 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
1e2a0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
1e2b0 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
1e2c0 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72  ation. .**.** Or
1e2d0 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61  , if the third a
1e2e0 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  rgument is NULL,
1e2f0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e300 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
1e310 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72  led .** to infor
1e320 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  m the VFS layer 
1e330 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20  that, according 
1e340 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78  to POSIX, any ex
1e350 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a  isting mapping .
1e360 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
1e370 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
1e380 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
1e390 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
1e3a0 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
1e3b0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
1e3c0 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
1e3d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1e3e0 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
1e3f0 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
1e400 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
1e410 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
1e420 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  ase file */..  /
1e430 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
1e440 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
1e450 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
1e460 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
1e470 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68  ing .  ** xFetch
1e480 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
1e490 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
1e4a0 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
1e4b0 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
1e4c0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
1e4d0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
1e4e0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
1e4f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1e500 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
1e510 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
1e520 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
1e530 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
1e540 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
1e550 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
1e560 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
1e570 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
1e580 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
1e590 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
1e5a0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
1e5b0 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22  et=%lld, p=%p\n"
1e5c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1e5d0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1e5e0 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c  Id(), pFd, iOff,
1e5f0 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29   p));..  if( p )
1e600 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
1e610 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
1e620 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20  .    /* FIXME:  
1e630 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79  If Windows truly
1e640 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73   always prevents
1e650 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64   truncating or d
1e660 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a  eleting a.    **
1e670 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61   file while a ma
1e680 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74  pping is held, t
1e690 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1e6a0 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29  g winUnmapfile()
1e6b0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20   call.    ** is 
1e6c0 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20  unnecessary can 
1e6d0 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d  can be omitted -
1e6e0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70   potentially imp
1e6f0 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65  roving.    ** pe
1e700 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20  rformance.  */. 
1e710 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1e720 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
1e730 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
1e740 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out>=0 );.#endif
1e750 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ..  OSTRACE(("UN
1e760 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1e770 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1e780 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1e790 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e7a0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
1e7b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1e7c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e7d0 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
1e7e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1e7f0 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
1e800 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
1e810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e820 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
1e830 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
1e840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
1e8b0 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
1e8c0 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
1e8d0 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
1e8e0 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
1e8f0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
1e900 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
1e910 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1e920 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69  e3_io_methods wi
1e930 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
1e940 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
1e970 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
1e9a0 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
1e9d0 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e9f0 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
1ea00 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
1ea30 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea50 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
1ea60 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea80 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
1ea90 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  inLock,         
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eab0 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
1eac0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eae0 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
1eaf0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1eb00 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
1eb10 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1eb20 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
1eb30 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
1eb40 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1eb50 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
1eb60 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb80 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
1eb90 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
1eba0 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
1ebb0 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
1ebc0 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
1ebd0 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
1ec00 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
1ec30 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
1ec60 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
1ec70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ec80 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
1ec90 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c  p */.  winFetch,
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
1ecc0 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68   */.  winUnfetch
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
1ecf0 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  h */.};../******
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed40 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1ed50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed60 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
1ed70 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1ed80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed90 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
1eda0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
1edb0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1edc0 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
1edd0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
1ede0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
1edf0 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 43 6f  ..#if 0./*.** Co
1ee00 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65  nvert a filename
1ee10 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74   from whatever t
1ee20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
1ee30 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a  erating system.*
1ee40 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66  * supports for f
1ee50 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54  ilenames into UT
1ee60 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
1ee70 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 69  old the result i
1ee80 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
1ee90 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
1eea0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
1eeb0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1eec0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
1eed0 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54  har *winConvertT
1eee0 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  oUtf8Filename(co
1eef0 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
1ef00 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  ame){.  char *zC
1ef10 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
1ef20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
1ef30 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
1ef40 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
1ef50 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  8(zFilename);.  
1ef60 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1ef70 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1ef80 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
1ef90 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
1efa0 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
1efb0 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
1efc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
1efd0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
1efe0 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
1eff0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
1f000 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  verted;.}.#endif
1f010 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1f020 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65  a UTF-8 filename
1f030 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
1f040 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  orm the underlyi
1f050 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  ng.** operating 
1f060 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c  system wants fil
1f070 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63  enames in.  Spac
1f080 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
1f090 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69  sult.** is obtai
1f0a0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
1f0b0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
1f0c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
1f0d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
1f0e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
1f0f0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
1f100 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
1f110 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1f120 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1f130 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f  ted = 0;.  if( o
1f140 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a  sIsNT() ){.    z
1f150 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55  Converted = winU
1f160 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1f170 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66  lename);.  }.#if
1f180 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1f190 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1f1a0 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
1f1b0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
1f1c0 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46  _utf8_to_mbcs(zF
1f1d0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  ilename);.  }.#e
1f1e0 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  ndif.  /* caller
1f1f0 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
1f200 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
1f210 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
1f220 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
1f230 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1f240 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
1f250 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46 2d  e specified UTF-
1f260 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a  8 string buffer.
1f270 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 64  ** ends with a d
1f280 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
1f290 6f 72 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  or character..*/
1f2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 45  .static int winE
1f2b0 6e 64 73 49 6e 44 69 72 53 65 70 28 63 68 61 72  ndsInDirSep(char
1f2c0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a   *zBuf){.  if( z
1f2d0 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Buf ){.    int n
1f2e0 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
1f2f0 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20  len30(zBuf);.   
1f300 20 72 65 74 75 72 6e 20 6e 4c 65 6e 3e 30 20 26   return nLen>0 &
1f310 26 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42  & winIsDirSep(zB
1f320 75 66 5b 6e 4c 65 6e 2d 31 5d 29 3b 0a 20 20 7d  uf[nLen-1]);.  }
1f330 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f340 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
1f350 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1f360 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  me and store the
1f370 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74   resulting point
1f380 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a  er into pzBuf..*
1f390 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1f3a0 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20  turned in pzBuf 
1f3b0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76 69  must be freed vi
1f3c0 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  a sqlite3_free()
1f3d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f3e0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
1f3f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1f400 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b  , char **pzBuf){
1f410 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
1f420 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
1f430 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1f440 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
1f450 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
1f460 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
1f470 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
1f480 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69  size_t i, j;.  i
1f490 6e 74 20 6e 42 75 66 2c 20 6e 4c 65 6e 3b 0a 20  nt nBuf, nLen;. 
1f4a0 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
1f4b0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
1f4c0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
1f4d0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
1f4e0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
1f4f0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
1f500 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
1f510 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
1f520 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
1f530 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
1f540 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
1f550 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
1f560 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1f570 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
1f580 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1f590 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
1f5a0 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
1f5b0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
1f5c0 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66  file.  ** name f
1f5d0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
1f5e0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20   file.  If this 
1f5f0 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74  fails, we cannot
1f600 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a   continue..  */.
1f610 20 20 6e 42 75 66 20 3d 20 70 56 66 73 2d 3e 6d    nBuf = pVfs->m
1f620 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 7a 42 75  xPathname;.  zBu
1f630 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f = sqlite3Mallo
1f640 63 5a 65 72 6f 28 20 6e 42 75 66 2b 32 20 29 3b  cZero( nBuf+2 );
1f650 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a  .  if( !zBuf ){.
1f660 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
1f670 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
1f680 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1f690 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  M\n"));.    retu
1f6a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1f6b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
1f6c0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1f6d0 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72  effective tempor
1f6e0 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
1f6f0 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20  First, check if 
1f700 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  one.  ** has bee
1f710 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  n explicitly set
1f720 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
1f730 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ion; otherwise, 
1f740 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a  use the one.  **
1f750 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
1f760 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
1f770 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  tem..  */.  asse
1f780 72 74 28 20 6e 42 75 66 3e 33 30 20 29 3b 0a 20  rt( nBuf>30 );. 
1f790 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
1f7a0 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
1f7b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f7c0 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75  ntf(nBuf-30, zBu
1f7d0 66 2c 20 22 25 73 25 73 22 2c 20 73 71 6c 69 74  f, "%s%s", sqlit
1f7e0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1f7f0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1f800 20 20 20 20 20 20 20 20 77 69 6e 45 6e 64 73 49          winEndsI
1f810 6e 44 69 72 53 65 70 28 73 71 6c 69 74 65 33 5f  nDirSep(sqlite3_
1f820 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 20  temp_directory) 
1f830 3f 20 22 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ? "" :.         
1f840 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 47              winG
1f850 65 74 44 69 72 44 65 70 28 29 29 3b 0a 20 20 7d  etDirDep());.  }
1f860 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
1f870 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b  YGWIN__).  else{
1f880 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1f890 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
1f8a0 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f   = {.       0, /
1f8b0 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  * getenv("SQLITE
1f8c0 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  _TMPDIR") */.   
1f8d0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
1f8e0 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  ("TMPDIR") */.  
1f8f0 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
1f900 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20  v("TMP") */.    
1f910 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
1f920 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  "TEMP") */.     
1f930 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
1f940 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f  USERPROFILE") */
1f950 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  .       "/var/tm
1f960 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72  p",.       "/usr
1f970 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
1f980 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22  tmp",.       "."
1f990 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ,.       0      
1f9a0 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
1f9b0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  ator */.    };. 
1f9c0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
1f9d0 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  i;.    const cha
1f9e0 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
1f9f0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
1fa00 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
1fa10 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
1fa20 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
1fa30 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
1fa40 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
1fa50 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  "TMPDIR");.    i
1fa60 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20  f( !azDirs[2] ) 
1fa70 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65  azDirs[2] = gete
1fa80 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69  nv("TMP");.    i
1fa90 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20  f( !azDirs[3] ) 
1faa0 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65  azDirs[3] = gete
1fab0 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20  nv("TEMP");.    
1fac0 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29  if( !azDirs[4] )
1fad0 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74   azDirs[4] = get
1fae0 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
1faf0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
1fb00 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
1fb10 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
1fb20 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
1fb30 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f  [i++]){.      vo
1fb40 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1fb50 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d        if( zDir==
1fb60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1fb70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
1fb80 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61  th starts with a
1fb90 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f   drive letter fo
1fba0 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f  llowed by the co
1fbb0 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  lon.      ** cha
1fbc0 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69  racter, assume i
1fbd0 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e  t is already a n
1fbe0 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
1fbf0 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  ; otherwise,.   
1fc00 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65     ** it must be
1fc10 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
1fc20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
1fc30 68 20 70 72 69 6f 72 20 76 69 61 20 74 68 65 20  h prior via the 
1fc40 43 79 67 77 69 6e 0a 20 20 20 20 20 20 2a 2a 20  Cygwin.      ** 
1fc50 41 50 49 20 70 72 69 6f 72 20 74 6f 20 75 73 69  API prior to usi
1fc60 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ng it..      */.
1fc70 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
1fc80 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
1fc90 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20  on(zDir) ){.    
1fca0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
1fcb0 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
1fcc0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72  tf8Filename(zDir
1fcd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1fce0 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
1fcf0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1fd00 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
1fd10 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1fd20 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
1fd30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fd40 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1fd50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fd60 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28     if( winIsDir(
1fd70 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
1fd80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fd90 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33  _snprintf(nBuf-3
1fda0 30 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  0, zBuf, "%s", z
1fdb0 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dir);.          
1fdc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1fdd0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
1fde0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fdf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1fe00 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1fe10 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rted);.      }el
1fe20 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e  se{.        zCon
1fe30 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
1fe40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66  MallocZero( nBuf
1fe50 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +1 );.        if
1fe60 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b  ( !zConverted ){
1fe70 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
1fe80 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
1fe90 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
1fea0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
1feb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1fec0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1fed0 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
1fee0 20 20 20 20 20 20 69 66 28 20 63 79 67 77 69 6e        if( cygwin
1fef0 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 49 73              osIs
1ff10 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
1ff20 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
1ff30 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20  POSIX_TO_WIN_A, 
1ff40 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20  zDir,.          
1ff50 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
1ff60 2c 20 6e 42 75 66 2b 31 29 3c 30 20 29 7b 0a 20  , nBuf+1)<0 ){. 
1ff70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ff80 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1ff90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
1ffa0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
1ffb0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
1ffc0 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22  OERR_CONVPATH\n"
1ffd0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
1ffe0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1fff0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  (SQLITE_IOERR_CO
20000 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
20010 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
20040 6d 65 31 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  me1", zDir);.   
20050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20060 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
20070 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
20080 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
20090 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
200a0 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72  he candidate dir
200b0 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e  ectory exists an
200c0 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20  d should.       
200d0 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20     ** be used.  
200e0 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20  However, we may 
200f0 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  need to convert 
20100 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  the string conta
20110 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ining.          
20120 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f  ** its name into
20130 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20   UTF-8 (i.e. if 
20140 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67  it is UTF-16 rig
20150 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20  ht now)..       
20160 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
20170 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
20180 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
20190 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 55 6e 69   *zUtf8 = winUni
201a0 63 6f 64 65 54 6f 55 74 66 38 28 7a 43 6f 6e 76  codeToUtf8(zConv
201b0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
201c0 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
201d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
201e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
201f0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
20200 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
20210 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
20220 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
20230 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
20240 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
20250 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
20260 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
20270 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
20280 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
20290 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22  nBuf-30, zBuf, "
202a0 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
202b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
202c0 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
202d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
202e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
202f0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
20300 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20320 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
20330 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42  intf(nBuf-30, zB
20340 75 66 2c 20 22 25 73 22 2c 20 7a 43 6f 6e 76 65  uf, "%s", zConve
20350 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
20360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20370 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
20380 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
203a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
203b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
203c0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  erted);.      }.
203d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
203e0 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51   }.  }.#elif !SQ
203f0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
20400 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
20410 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  IN__).  else if(
20420 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
20430 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
20440 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50     LPWSTR zWideP
20450 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
20460 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 2a 73 69  locZero( nBuf*si
20470 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20  zeof(WCHAR) );. 
20480 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61 74     if( !zWidePat
20490 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  h ){.      sqlit
204a0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
204b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
204c0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
204d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
204e0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
204f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
20500 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
20510 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d      if( osGetTem
20520 70 50 61 74 68 57 28 6e 42 75 66 2c 20 7a 57 69  pPathW(nBuf, zWi
20530 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20  dePath)==0 ){.  
20540 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20550 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
20560 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20570 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
20580 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
20590 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
205a0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
205b0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
205c0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
205d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
205e0 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
205f0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20610 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
20620 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
20630 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77  }.    zMulti = w
20640 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
20650 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
20660 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20  if( zMulti ){.  
20670 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
20680 69 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42  intf(nBuf-30, zB
20690 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69  uf, "%s", zMulti
206a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
206b0 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20  _free(zMulti);. 
206c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
206d0 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
206e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
206f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
20700 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
20710 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
20720 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
20730 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
20740 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
20750 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
20760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20770 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
20780 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
20790 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
207a0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
207b0 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
207c0 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68   char *zMbcsPath
207d0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
207e0 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20  Zero( nBuf );.  
207f0 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68    if( !zMbcsPath
20800 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20810 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
20820 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
20830 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
20840 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
20850 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
20860 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
20870 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
20880 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
20890 50 61 74 68 41 28 6e 42 75 66 2c 20 7a 4d 62 63  PathA(nBuf, zMbc
208a0 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  sPath)==0 ){.   
208b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
208c0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
208d0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
208e0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
208f0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
20900 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
20910 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
20920 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
20930 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
20940 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
20970 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20  name2", 0);.    
20980 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71  }.    zUtf8 = sq
20990 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
209a0 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61  _to_utf8(zMbcsPa
209b0 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  th);.    if( zUt
209c0 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
209d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
209e0 66 2d 33 30 2c 20 7a 42 75 66 2c 20 22 25 73 22  f-30, zBuf, "%s"
209f0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
20a00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
20a10 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
20a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20a30 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
20a40 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
20a50 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
20a60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
20a70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
20a80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
20a90 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
20aa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20ab0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a  WIN32_HAS_ANSI *
20ac0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  /.#endif /* !SQL
20ad0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
20ae0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
20af0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
20b00 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
20b10 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
20b20 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
20b30 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
20b40 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
20b50 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
20b60 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
20b70 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 0a 20  rlen30(zBuf);.. 
20b80 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 73 71 6c   if( (nLen + sql
20b90 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c  ite3Strlen30(SQL
20ba0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
20bb0 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e  EFIX) + 18) >= n
20bc0 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Buf ){.    sqlit
20bd0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
20be0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
20bf0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
20c00 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
20c10 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
20c20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
20c30 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74  RROR, 0, "winGet
20c40 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a  Tempname3", 0);.
20c50 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73    }..  sqlite3_s
20c60 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2d  nprintf(nBuf-18-
20c70 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c  nLen, zBuf+nLen,
20c80 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c   SQLITE_TEMP_FIL
20c90 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20  E_PREFIX);..  j 
20ca0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20cb0 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  0(zBuf);.  sqlit
20cc0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
20cd0 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66  , &zBuf[j]);.  f
20ce0 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
20cf0 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  +, j++){.    zBu
20d00 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
20d10 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
20d20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
20d30 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
20d40 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a   ];.  }.  zBuf[j
20d50 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b  ] = 0;.  zBuf[j+
20d60 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66  1] = 0;.  *pzBuf
20d70 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52   = zBuf;..  OSTR
20d80 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
20d90 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  AME name=%s, rc=
20da0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42  SQLITE_OK\n", zB
20db0 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  uf));.  return S
20dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20dd0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
20de0 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  f the named file
20df0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72   is really a dir
20e00 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20  ectory.  Return 
20e10 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69  false if.** it i
20e20 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
20e30 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f  r than a directo
20e40 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20  ry, or if there 
20e50 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d  is any kind of m
20e60 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
20e70 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a  ion failure..*/.
20e80 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73  static int winIs
20e90 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  Dir(const void *
20ea0 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44  zConverted){.  D
20eb0 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
20ec0 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
20ed0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69   lastErrno;..  i
20ee0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
20ef0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
20f00 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
20f10 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
20f20 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
20f30 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
20f40 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
20f50 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
20f60 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
20f70 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
20f80 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
20f90 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
20fc0 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
20ff0 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
21000 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
21010 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
21020 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72  ( !rc ){.      r
21030 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61  eturn 0; /* Inva
21040 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20  lid name? */.   
21050 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41   }.    attr = sA
21060 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
21070 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51  tributes;.#if SQ
21080 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
21090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74  .  }else{.    at
210a0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
210b0 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
210c0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
210d0 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
210e0 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44  n (attr!=INVALID
210f0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
21100 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f  ) && (attr&FILE_
21110 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
21120 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ORY);.}../*.** O
21130 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
21140 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
21150 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
21160 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
21170 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d 61  * Used to get ma
21180 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65 20  ximum path name 
21190 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73  length */.  cons
211a0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
211b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
211c0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
211d0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
211e0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
211f0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
21200 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
21210 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
21220 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
21230 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
21240 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
21250 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
21260 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
21270 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
21280 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
21290 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
212a0 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  o;.  DWORD dwDes
212b0 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
212c0 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
212d0 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
212e0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
212f0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
21300 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
21310 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
21320 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
21330 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
21340 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
21350 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
21360 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
21370 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
21380 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
21390 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
213a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
213b0 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
213c0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
213d0 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
213e0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
213f0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
21400 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
21410 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
21420 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
21430 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
21440 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
21450 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
21460 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
21470 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
21480 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70   */.  char *zTmp
21490 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72  name = 0; /* For
214a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
214b0 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72  ame, if necessar
214c0 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  y. */..  int rc 
214d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
214e0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
214f0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
21500 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
21510 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
21520 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
21530 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
21540 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
21550 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
21560 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
21570 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
21580 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
21590 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
215a0 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
215b0 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
215c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
215d0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
215e0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
215f0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
21600 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
21610 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
21620 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
21630 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
21640 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
21650 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
21660 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
21670 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
21680 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
21690 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
216a0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
216b0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
216c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
216d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
216e0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
216f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
21700 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
21710 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
21720 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
21730 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  f..  OSTRACE(("O
21740 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69  PEN name=%s, pFi
21750 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
21760 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22   pOutFlags=%p\n"
21770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74  ,.           zUt
21780 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67  f8Name, id, flag
21790 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a  s, pOutFlags));.
217a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
217b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
217c0 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
217d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
217e0 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
217f0 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
21800 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
21810 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
21820 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
21830 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
21840 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
21850 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
21860 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
21870 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
21880 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
21890 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
218a0 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
218b0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
218c0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
218d0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
218e0 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
218f0 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
21900 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
21910 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
21920 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
21930 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
21940 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
21950 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
21960 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
21970 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
21980 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
21990 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
219a0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
219b0 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
219c0 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
219d0 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
219e0 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
219f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
21a00 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
21a10 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
21a20 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
21a30 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
21a40 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
21a50 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
21a60 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
21a70 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
21a80 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
21a90 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
21aa0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
21ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
21ac0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
21ad0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
21ae0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
21af0 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
21b00 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
21b10 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
21b20 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
21b30 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
21b40 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
21b50 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
21b60 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
21b70 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
21b80 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
21b90 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
21ba0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
21bb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
21bc0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
21bd0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
21be0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
21bf0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
21c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
21c10 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
21c20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
21c30 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
21c40 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
21c50 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
21c60 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
21c70 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
21c80 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
21c90 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
21ca0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
21cb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
21cc0 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  le!=0 );.  memse
21cd0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
21ce0 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20  of(winFile));.  
21cf0 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
21d00 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
21d10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
21d20 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74  WINRT.  if( !zUt
21d30 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74  f8Name && !sqlit
21d40 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
21d50 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
21d60 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
21d70 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
21d80 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
21d90 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
21da0 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
21db0 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
21dc0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  f..  /* If the s
21dd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
21de0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
21df0 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
21e00 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  e a .  ** tempor
21e10 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ary file name to
21e20 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28   use .  */.  if(
21e30 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
21e40 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65 6c     assert( isDel
21e50 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
21e60 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  urnal );.    rc 
21e70 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  = winGetTempname
21e80 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65  (pVfs, &zTmpname
21e90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21eb0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
21ec0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22   name=%s, rc=%s"
21ed0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c  , zUtf8Name, sql
21ee0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
21ef0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21f00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
21f10 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
21f20 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
21f30 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
21f40 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
21f50 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
21f60 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
21f70 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
21f80 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
21f90 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
21fa0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
21fb0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
21fc0 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
21fd0 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
21fe0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
21ff0 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
22000 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
22010 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a  URI) ||.       z
22020 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33  Utf8Name[sqlite3
22030 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61  Strlen30(zUtf8Na
22040 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
22050 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66  /* Convert the f
22060 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73  ilename to the s
22070 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20  ystem encoding. 
22080 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  */.  zConverted 
22090 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
220a0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
220b0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
220c0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
220d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
220e0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
220f0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
22100 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
22110 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
22120 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
22130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22140 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
22150 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
22160 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
22170 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22180 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
221a0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
221b0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
221c0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43  =%s, rc=SQLITE_C
221d0 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20  ANTOPEN_ISDIR", 
221e0 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
221f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22200 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20  ANTOPEN_ISDIR;. 
22210 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
22220 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
22230 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
22240 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
22250 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
22260 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
22270 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
22280 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
22290 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
222a0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
222b0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
222c0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
222d0 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  s .  ** created.
222e0 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
222f0 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
22300 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
22310 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69  cess" .  ** as i
22320 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
22330 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
22340 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
22350 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
22360 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
22370 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
22380 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
22390 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
223a0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
223b0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
223c0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
223d0 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
223e0 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
223f0 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
22400 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
22410 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
22420 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
22430 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
22440 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
22450 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
22460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
22470 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
22480 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
22490 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
224a0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
224b0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
224c0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
224d0 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
224e0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
224f0 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
22500 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
22510 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
22520 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
22530 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
22540 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
22550 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
22560 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
22570 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
22580 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
22590 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
225c0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
225d0 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
22600 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
22610 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
22620 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
22630 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
22640 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
22650 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
22660 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
22670 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
22680 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
22690 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
226a0 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
226b0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
226c0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
226d0 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
226e0 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
226f0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
22700 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
22710 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
22720 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  if..  if( osIsNT
22730 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
22740 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52  _OS_WINRT.    CR
22750 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
22760 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78  ED_PARAMETERS ex
22770 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
22780 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
22790 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20  rameters.dwSize 
227a0 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46  = sizeof(CREATEF
227b0 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
227c0 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65  RAMETERS);.    e
227d0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
227e0 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  s.dwFileAttribut
227f0 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  es =.           
22800 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
22810 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54  butes & FILE_ATT
22820 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20  RIBUTE_MASK;.   
22830 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
22840 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20  ers.dwFileFlags 
22850 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  = dwFlagsAndAttr
22860 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c  ibutes & FILE_FL
22870 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  AG_MASK;.    ext
22880 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
22890 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61  dwSecurityQosFla
228a0 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e  gs = SECURITY_AN
228b0 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74  ONYMOUS;.    ext
228c0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
228d0 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62  lpSecurityAttrib
228e0 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utes = NULL;.   
228f0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
22900 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c  ers.hTemplateFil
22910 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68  e = NULL;.    wh
22920 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
22930 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52  teFile2((LPCWSTR
22940 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
22970 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
229a0 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20  eMode,.         
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
229d0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65 6e            &exten
22a00 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d  dedParameters))=
22a10 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
22a20 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
22a50 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
22a60 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
22a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
22a80 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   */.    }.#else.
22a90 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
22aa0 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c  osCreateFileW((L
22ab0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
22ac0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
22af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
22b20 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b40 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
22b50 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
22b80 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
22bb0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
22bc0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
22bf0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
22c00 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
22c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
22c20 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p */.    }.#endi
22c30 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
22c40 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
22c50 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77  SI.  else{.    w
22c60 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
22c70 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52  ateFileA((LPCSTR
22c80 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ca0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
22cb0 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
22ce0 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
22d10 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
22d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
22d50 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
22d80 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
22d90 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
22dc0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
22dd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
22de0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
22df0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
22e00 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
22e10 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  t);..  OSTRACE((
22e20 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
22e30 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
22e40 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c  lx, rc=%s\n", h,
22e50 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20   zUtf8Name,.    
22e60 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
22e70 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41  Access, (h==INVA
22e80 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
22e90 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
22ea0 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
22eb0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
22ec0 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69  VALUE ){.    pFi
22ed0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
22ee0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
22ef0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22f00 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c  E_CANTOPEN, pFil
22f10 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
22f20 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
22f30 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
22f40 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22f50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22f60 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
22f70 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
22f80 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
22f90 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
22fa0 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
22fb0 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
22fc0 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
22fd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
22fe0 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20  LY) &.          
22ff0 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c             ~(SQL
23000 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
23010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23020 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
23030 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20    pOutFlags);.  
23040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
23050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
23060 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
23070 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
23080 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
23090 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
230a0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
230b0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
230c0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
230d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
230e0 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
230f0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
23100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
23110 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
23120 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
23130 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61  ess=%lx, pOutFla
23140 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67  gs=%p, *pOutFlag
23150 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  s=%d, ".        
23160 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c     "rc=%s\n", h,
23170 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65   zUtf8Name, dwDe
23180 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75  siredAccess, pOu
23190 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  tFlags, pOutFlag
231a0 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a  s ?.           *
231b0 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28  pOutFlags : 0, (
231c0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
231d0 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
231e0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23  ed" : "ok"));..#
231f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23200 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
23210 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
23220 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23230 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63  DB.       && (rc
23240 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f   = winceCreateLo
23250 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
23260 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )!=SQLITE_OK.  )
23270 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
23280 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  dle(h);.    sqli
23290 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
232a0 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
232b0 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
232c0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
232d0 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d  OPEN-CE-LOCK nam
232e0 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
232f0 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  zName, sqlite3Er
23300 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
23310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
23320 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
23330 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
23340 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
23350 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
23360 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
23370 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23380 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
23390 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
233a0 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c  me);.  }..  pFil
233b0 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69  e->pMethod = &wi
233c0 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69  nIoMethod;.  pFi
233d0 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  le->pVfs = pVfs;
233e0 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
233f0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
23400 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  y ){.    pFile->
23410 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
23420 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
23430 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
23440 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65  ri_boolean(zName
23450 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45  , "psow", SQLITE
23460 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
23470 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69  RITE) ){.    pFi
23480 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
23490 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20   WINFILE_PSOW;. 
234a0 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74   }.  pFile->last
234b0 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
234c0 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
234d0 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51   = zName;.#if SQ
234e0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
234f0 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  ZE>0.  pFile->hM
23500 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69  ap = NULL;.  pFi
23510 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
23520 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
23530 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69  pSize = 0;.  pFi
23540 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
23550 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  al = 0;.  pFile-
23560 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
23570 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23580 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.szMmap;.#endi
23590 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  f..  OpenCounter
235a0 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (+1);.  return r
235b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
235c0 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
235d0 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
235e0 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20  at Windows does 
235f0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
23600 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
23610 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
23620 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
23630 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
23640 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
23650 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
23660 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
23670 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
23680 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
23690 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
236a0 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
236b0 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20  atever it does. 
236c0 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
236d0 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
236e0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
236f0 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
23700 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
23710 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
23720 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
23730 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
23740 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
23750 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
23760 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
23770 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
23780 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
23790 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
237a0 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
237b0 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
237c0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
237d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
237e0 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  nDelete(.  sqlit
237f0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
23800 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
23810 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
23820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
23830 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  lename,      /* 
23840 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
23850 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
23860 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20  syncDir         
23870 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
23880 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
23890 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
238a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
238b0 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52  ORD attr;.  DWOR
238c0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76  D lastErrno;.  v
238d0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
238e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
238f0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
23900 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79  SED_PARAMETER(sy
23910 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c  ncDir);..  Simul
23920 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
23930 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
23940 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43  ELETE);.  OSTRAC
23950 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
23960 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e  %s, syncDir=%d\n
23970 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79  ", zFilename, sy
23980 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e  ncDir));..  zCon
23990 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
239a0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
239b0 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
239c0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
239d0 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
239e0 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
239f0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
23a00 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
23a10 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
23a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23a30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
23a40 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
23a50 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51  .    do {.#if SQ
23a60 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
23a70 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
23a80 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
23a90 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d  ttrData;.      m
23aa0 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
23ab0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
23ac0 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69  rData));.      i
23ad0 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  f ( osGetFileAtt
23ae0 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76  ributesExW(zConv
23af0 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78  erted, GetFileEx
23b00 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20  &sAttrData) ){. 
23b40 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
23b50 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
23b60 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
23b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
23b80 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
23b90 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
23ba0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
23bb0 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
23bc0 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
23bd0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
23be0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
23bf0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
23c00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
23c10 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
23c20 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
23c30 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
23c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
23c50 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
23c60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23c70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23c80 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61   }.#else.      a
23c90 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
23ca0 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
23cb0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
23cc0 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
23cd0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
23ce0 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
23cf0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
23d00 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
23d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
23d20 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
23d30 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
23d40 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
23d50 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
23d60 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
23d70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23d80 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
23d90 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
23da0 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
23db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23dc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
23dd0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
23de0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
23e00 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
23e10 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
23e20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23e30 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
23e40 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
23e50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
23e70 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28  ( osDeleteFileW(
23e80 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
23e90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23ea0 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
23eb0 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
23ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
23ed0 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
23ee0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
23ef0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
23f00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23f10 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
23f20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
23f30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
23f40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
23f50 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
23f60 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
23f70 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
23f80 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
23f90 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
23fa0 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
23fb0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
23fc0 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
23fd0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
23fe0 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
23ff0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
24000 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
24010 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
24020 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
24030 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
24040 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
24050 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
24060 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
24070 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
24080 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
24090 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
240a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
240b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
240c0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
240d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
240e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
240f0 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
24100 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
24110 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
24120 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24130 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
24140 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
24150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
24160 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
24170 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
24180 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
24190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
241a0 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
241b0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
241c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
241d0 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
241e0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
241f0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
24200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
24210 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
24220 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
24230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24240 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
24250 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
24260 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c  f( rc && rc!=SQL
24270 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
24280 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63  _NOENT ){.    rc
24290 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
242a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
242b0 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  TE, lastErrno, "
242c0 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
242d0 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
242e0 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
242f0 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (cnt);.  }.  sql
24300 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
24310 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
24320 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
24330 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69  s, rc=%s\n", zFi
24340 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  lename, sqlite3E
24350 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
24360 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24370 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
24380 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74  istence and stat
24390 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
243a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
243b0 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
243c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
243d0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
243e0 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
243f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
24400 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
24410 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
24420 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
24430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24440 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
24450 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
24460 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
24470 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
24480 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
24490 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
244a0 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
244b0 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
244c0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69  lastErrno;.  voi
244d0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
244e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
244f0 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
24500 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
24510 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
24520 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53  _ACCESS; );.  OS
24530 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
24540 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78  ame=%s, flags=%x
24550 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
24560 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
24570 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52  ename, flags, pR
24580 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e  esOut));..  zCon
24590 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
245a0 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
245b0 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
245c0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
245d0 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
245e0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
245f0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
24600 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
24610 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
24620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
24630 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
24640 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
24650 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
24660 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
24670 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
24680 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
24690 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
246a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
246b0 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
246c0 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
246d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
246e0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
246f0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
24720 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20  oStandard, .    
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
24750 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
24760 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
24770 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
24780 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24790 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
247a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
247b0 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
247c0 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
247d0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
247e0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
247f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
24800 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
24810 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
24820 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
24830 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
24840 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20  SizeHigh==0 .   
24850 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
24860 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
24870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
24880 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
24890 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
248a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
248b0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
248c0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
248d0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
248e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
248f0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29  winLogIoerr(cnt)
24900 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
24910 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c  Errno!=ERROR_FIL
24920 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c  E_NOT_FOUND && l
24930 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
24940 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
24950 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24960 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24970 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
24980 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
24990 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
249a0 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  SS, lastErrno, "
249b0 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20  winAccess",.    
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
249e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
249f0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
24a00 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
24a10 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
24a20 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
24a30 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
24a40 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
24a50 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
24a60 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
24a70 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
24a80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
24a90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24aa0 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
24ab0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
24ac0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
24ad0 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
24ae0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
24af0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
24b00 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
24b10 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
24b20 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
24b30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24b40 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
24b50 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
24b60 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
24b70 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
24b80 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
24b90 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
24ba0 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
24bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24bc0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
24bd0 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
24be0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
24bf0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
24c00 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
24c10 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
24c20 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %s, pResOut=%p, 
24c30 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
24c40 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
24c50 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
24c60 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  me, pResOut, *pR
24c70 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
24c80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24c90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
24ca0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
24cb0 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
24cc0 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
24cd0 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20  drive letter.** 
24ce0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f  followed by a co
24cf0 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  lon character..*
24d00 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
24d10 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
24d20 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20  dColon(.  const 
24d30 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a  char *zPathname.
24d40 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71  ){.  return ( sq
24d50 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
24d60 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
24d70 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
24d80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
24d90 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
24da0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
24db0 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62  th name should b
24dc0 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e  e used verbatim.
24dd0 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f    If.** non-zero
24de0 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f   is returned fro
24df0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  m this function,
24e00 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
24e10 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c  ction must simpl
24e20 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f  y.** use the pro
24e30 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20  vided path name 
24e40 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65  verbatim -OR- re
24e50 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20  solve it into a 
24e60 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a  full path name.*
24e70 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74 46  * using the GetF
24e80 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33  ullPathName Win3
24e90 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28  2 API function (
24ea0 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
24eb0 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
24ec0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
24ed0 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame(.  const cha
24ee0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
24ef0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
24f00 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
24f10 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72 64  s with a forward
24f20 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b   slash or a back
24f30 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69 74  slash, it is eit
24f40 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c  her.  ** a legal
24f50 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c   UNC name, a vol
24f60 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  ume relative pat
24f70 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  h, or an absolut
24f80 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74  e path name in t
24f90 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66  he.  ** "Unix" f
24fa0 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73  ormat on Windows
24fb0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65  .  There is no e
24fc0 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66 65  asy way to diffe
24fd0 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
24fe0 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
24ff0 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65  two cases; there
25000 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20  fore, we return 
25010 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72 6e  the safer return
25020 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20   value of TRUE. 
25030 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c   ** so that call
25040 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
25050 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79  tion will simply
25060 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
25070 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69  ..  */.  if ( wi
25080 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e  nIsDirSep(zPathn
25090 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72  ame[0]) ){.    r
250a0 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
250b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
250c0 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
250d0 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72  ts with a letter
250e0 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20   and a colon it 
250f0 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75  is either a volu
25100 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  me.  ** relative
25110 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f   path or an abso
25120 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c  lute path.  Call
25130 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ers of this func
25140 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20  tion must not.  
25150 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72  ** attempt to tr
25160 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61  eat it as a rela
25170 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28  tive path name (
25180 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64  i.e. they should
25190 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a   simply use.  **
251a0 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20   it verbatim).. 
251b0 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
251c0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
251d0 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29  lon(zPathname) )
251e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
251f0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
25200 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 74  * If we get to t
25210 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70  his point, the p
25220 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
25230 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79  almost certainly
25240 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a   be a purely.  *
25250 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28  * relative one (
25260 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e  i.e. not a UNC n
25270 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74  ame, not absolut
25280 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d  e, and not volum
25290 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a  e relative)..  *
252a0 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  /.  return FALSE
252b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
252c0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
252d0 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
252e0 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
252f0 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
25300 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
25310 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
25320 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
25330 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
25340 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
25350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25360 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
25370 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25380 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
25390 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
253a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
253b0 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
253c0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
253d0 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
253e0 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
253f0 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25410 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
25420 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
25430 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
25460 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
25470 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
25480 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
25490 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
254a0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
254b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
254c0 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72  (nFull);.  asser
254d0 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e  t( nFull>=pVfs->
254e0 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
254f0 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
25500 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
25510 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
25520 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
25530 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
25540 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
25550 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
25560 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
25570 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
25580 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
25590 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
255a0 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
255b0 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
255c0 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
255d0 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
255e0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
255f0 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
25600 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
25610 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
25620 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
25630 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61  ectory and a sla
25640 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  sh..    */.    c
25650 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
25660 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
25670 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
25680 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
25690 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
256a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
256b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
256c0 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
256d0 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f  _path(CCP_POSIX_
256e0 54 4f 5f 57 49 4e 5f 41 7c 43 43 50 5f 52 45 4c  TO_WIN_A|CCP_REL
256f0 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
25700 2c 20 7a 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , zOut,.        
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
25730 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  e+1)<0 ){.      
25740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
25750 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
25760 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
25770 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
25780 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
25790 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
257b0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
257c0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
257d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
257e0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
257f0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
25800 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
25810 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25830 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
25840 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 44 65  ory, winGetDirDe
25850 70 28 29 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  p(), zOut);.    
25860 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
25870 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
25880 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
25890 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f  _path(CCP_POSIX_
258a0 54 4f 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c 61 74  TO_WIN_A, zRelat
258b0 69 76 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c  ive, zFull, nFul
258c0 6c 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l)<0 ){.      re
258d0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
258e0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
258f0 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
25900 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
25930 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
25940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25960 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
25970 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
25980 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29  SQLITE_OS_WINRT)
25990 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
259a0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
259b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
259c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
259d0 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
259e0 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
259f0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
25a00 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
25a10 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69  told. */.  /* Wi
25a20 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74  nRT has no way t
25a30 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61  o convert a rela
25a40 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20  tive path to an 
25a50 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f  absolute one. */
25a60 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
25a70 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
25a80 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
25a90 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
25aa0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
25ab0 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
25ac0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
25ad0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
25ae0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
25af0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
25b00 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
25b10 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
25b20 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
25b30 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
25b40 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
25b50 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
25b60 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
25b70 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
25b80 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
25b90 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
25ba0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
25bb0 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
25bc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
25bd0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
25be0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
25bf0 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
25c00 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s%s",.          
25c10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25c20 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
25c30 79 2c 20 77 69 6e 47 65 74 44 69 72 44 65 70 28  y, winGetDirDep(
25c40 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
25c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
25c60 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
25c70 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
25c80 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
25c90 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
25ca0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
25cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
25cc0 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
25cd0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
25ce0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
25cf0 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
25d00 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
25d10 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
25d20 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
25d30 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
25d40 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
25d50 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
25d60 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
25d70 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
25d80 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
25d90 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
25da0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
25db0 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
25dc0 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
25dd0 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69  ='/' && winIsDri
25de0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
25df0 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b  (zRelative+1) ){
25e00 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
25e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
25e20 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
25e30 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
25e40 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
25e50 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
25e60 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
25e70 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
25e80 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
25e90 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
25ea0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
25eb0 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
25ec0 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
25ed0 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
25ee0 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
25ef0 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
25f00 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
25f10 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
25f20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
25f30 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
25f40 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
25f50 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
25f60 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
25f70 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
25f80 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
25f90 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
25fa0 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
25fb0 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
25fc0 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
25fd0 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
25fe0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
25ff0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
26000 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
26010 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
26020 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
26030 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
26040 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
26050 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
26060 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
26070 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
26080 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
26090 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
260a0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
260b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
260c0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
260d0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
260e0 6c 6c 2c 20 22 25 73 25 73 25 73 22 2c 0a 20 20  ll, "%s%s%s",.  
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
26110 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
26120 74 44 69 72 44 65 70 28 29 2c 20 7a 52 65 6c 61  tDirDep(), zRela
26130 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
26140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
26150 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
26160 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
26170 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
26180 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
26190 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
261a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
261b0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
261c0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
261d0 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
261e0 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
261f0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
26200 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
26210 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
26220 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
26230 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
26240 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
26250 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
26260 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
26270 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26280 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
26290 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
262c0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
262d0 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
262e0 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
262f0 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
26300 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
26310 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
26320 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
26330 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
26340 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
26350 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
26360 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26370 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
26380 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
26390 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
263a0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
263b0 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
263c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
263d0 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
263e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
263f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
26400 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
26410 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
26420 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
26430 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
26440 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
26450 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
26480 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
26490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
264a0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
264b0 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
264c0 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
264d0 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
264e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
264f0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
26500 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
26510 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
26520 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
26530 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
26540 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
26550 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
26560 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
26570 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
26580 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26590 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
265a0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
265b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
265c0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
265d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
265e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
265f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
26600 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a  ullPathname3", z
26610 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
26620 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
26630 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
26640 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
26650 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
26660 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
26670 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
26680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26690 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
266a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
266b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
266c0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
266d0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
266e0 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
266f0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
26700 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
26710 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
26720 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26730 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
26740 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26750 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
26760 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
26770 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
26780 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
26790 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
267c0 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74  thname4", zRelat
267d0 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
267e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
267f0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
26800 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
26810 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
26820 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
26830 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
26840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
26850 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
26860 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
26870 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
26880 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
26890 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
268a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
268b0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
268c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
268d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
268e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
268f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
26900 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
26910 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
26920 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
26930 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
26940 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
26950 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
26960 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
26970 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
26980 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
26990 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
269a0 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
269b0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
269c0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
269d0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
269e0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
269f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
26a00 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
26a10 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
26a20 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
26a30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
26a40 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
26a50 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
26a60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
26a70 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
26a80 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
26a90 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
26aa0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
26ab0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
26ac0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
26ad0 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  Vfs);.  if( zCon
26ae0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
26af0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
26b00 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
26b10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
26b20 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c  INRT.    h = osL
26b30 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
26b40 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  ry((LPCWSTR)zCon
26b50 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73  verted, 0);.#els
26b60 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  e.    h = osLoad
26b70 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54  LibraryW((LPCWST
26b80 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  R)zConverted);.#
26b90 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
26ba0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
26bb0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
26bc0 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
26bd0 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
26be0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
26bf0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
26c00 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26c10 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
26c20 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
26c30 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
26c40 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
26c50 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
26c60 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
26c70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
26c80 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74  s);.  winGetLast
26c90 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
26ca0 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
26cb0 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
26cc0 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
26cd0 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
26ce0 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63  *pVfs,void *pH,c
26cf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29  onst char *zSym)
26d00 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45  )(void){.  UNUSE
26d10 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
26d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
26d30 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74  d(*)(void))osGet
26d40 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
26d50 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a  NDLE)pH, zSym);.
26d60 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
26d70 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
26d80 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
26d90 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
26da0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
26db0 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69  Vfs);.  osFreeLi
26dc0 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
26dd0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
26de0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
26df0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
26e00 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
26e10 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
26e20 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
26e30 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
26e40 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
26e50 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
26e60 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
26e70 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
26e80 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
26e90 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
26ea0 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
26eb0 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
26ec0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
26ed0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
26ee0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
26ef0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
26f00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26f10 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
26f20 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
26f30 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
26f40 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
26f50 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
26f60 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
26f70 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
26f80 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
26f90 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
26fa0 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
26fb0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
26fc0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
26fd0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
26fe0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
26ff0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
27000 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
27010 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
27020 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
27030 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
27040 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
27050 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
27060 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
27070 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
27080 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a  _WINRT.  if( siz
27090 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d  eof(ULONGLONG)<=
270a0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c  nBuf-n ){.    UL
270b0 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
270c0 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
270d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
270e0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
270f0 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
27100 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
27110 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
27120 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
27130 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
27140 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
27150 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
27160 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
27170 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
27180 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
27190 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
271a0 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65  endif.  if( size
271b0 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
271c0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
271d0 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
271e0 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
271f0 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
27200 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
27210 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
27220 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
27230 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
27240 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
27250 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
27260 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
27270 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
27280 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
27290 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
272a0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
272b0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
272c0 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
272d0 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69  c){.  sqlite3_wi
272e0 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f  n32_sleep((micro
272f0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
27300 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27310 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
27320 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
27330 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
27340 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
27350 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
27360 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
27370 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
27380 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
27390 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
273a0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
273b0 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
273c0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
273d0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
273e0 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
273f0 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
27400 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
27410 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
27420 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
27430 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
27440 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
27450 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
27460 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
27470 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
27480 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
27490 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
274a0 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
274b0 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
274c0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
274d0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
274e0 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
274f0 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
27500 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
27510 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
27520 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
27530 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
27540 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
27550 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
27560 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
27570 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
27580 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
27590 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
275a0 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
275b0 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
275c0 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
275d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
275e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
275f0 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
27600 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
27610 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
27620 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
27630 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
27640 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27650 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
27660 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c  piNow){.  /* FIL
27670 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20  ETIME structure 
27680 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75  is a 64-bit valu
27690 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  e representing t
276a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  he number of .  
276b0 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
276c0 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
276d0 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
276e0 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
276f0 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45  5). .  */.  FILE
27700 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69  TIME ft;.  stati
27710 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
27720 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d  int64 winFiletim
27730 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33  eEpoch = 2305813
27740 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
27750 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66  )8640000;.#ifdef
27760 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
27770 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
27780 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
27790 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
277a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
277b0 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20  40000;.#endif.  
277c0 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f  /* 2^32 - to avo
277d0 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64  id use of LL and
277e0 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63   warnings in gcc
277f0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
27800 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
27810 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d   max32BitValue =
27820 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33   .      (sqlite3
27830 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
27840 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
27850 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a  64)2000000000 +.
27860 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
27870 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
27880 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
27890 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
278a0 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53  E time;.  osGetS
278b0 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
278c0 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d  ;.  /* if System
278d0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29  TimeToFileTime()
278e0 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72   fails, it retur
278f0 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  ns zero. */.  if
27900 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54   (!osSystemTimeT
27910 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
27920 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
27930 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
27940 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65    }.#else.  osGe
27950 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
27960 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
27970 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
27980 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
27990 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
279a0 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
279b0 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
279c0 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
279d0 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
279e0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
279f0 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
27a00 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
27a10 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
27a20 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
27a30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
27a40 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
27a50 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
27a60 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
27a70 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
27a80 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
27a90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
27aa0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27ab0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
27ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
27ad0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
27ae0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
27af0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
27b00 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
27b10 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
27b20 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
27b30 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
27b40 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
27b50 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
27b60 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
27b70 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
27b80 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
27b90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27ba0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
27bb0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27bc0 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
27bd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
27be0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
27bf0 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
27c00 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
27c10 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
27c20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
27c30 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
27c40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27c50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
27c60 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
27c70 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
27c80 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
27c90 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
27ca0 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
27cb0 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64  essage() on Wind
27cc0 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
27cd0 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
27ce0 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65  ) on Unix). Afte
27cf0 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
27d00 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
27d10 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
27d20 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
27d30 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
27d40 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
27d50 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
27d60 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
27d70 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
27d80 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
27d90 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
27da0 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
27db0 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
27dc0 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
27dd0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
27de0 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
27df0 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
27e00 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
27e10 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
27e20 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
27e30 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
27e40 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
27e50 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
27e60 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
27e70 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
27e80 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
27e90 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
27ea0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
27eb0 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
27ec0 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
27ed0 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
27ee0 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
27ef0 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
27f00 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
27f10 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
27f20 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
27f30 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
27f40 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
27f50 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
27f60 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
27f70 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
27f80 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
27f90 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
27fa0 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
27fb0 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
27fc0 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
27fd0 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
27fe0 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
27ff0 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
28000 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28010 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
28020 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
28030 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
28040 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
28050 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
28060 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
28070 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
28080 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
28090 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
280a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
280b0 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
280c0 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
280d0 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
280e0 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
280f0 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
28100 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
28110 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
28120 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
28130 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
28140 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
28150 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
28160 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
28170 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
28180 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
28190 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
281a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
281b0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69  fs);.  return wi
281c0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
281d0 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
281e0 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
281f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
28200 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
28210 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
28220 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
28230 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
28240 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
28250 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
28260 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
28270 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
28280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
28290 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
282a0 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
282b0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
282c0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
282d0 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
282e0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
282f0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28310 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
28320 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
28330 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
28340 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
28350 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
28360 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
28370 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
28380 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
28390 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
283a0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
283b0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
283c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
283d0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
283e0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
283f0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
28400 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
28410 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
28420 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
28430 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
28440 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
28450 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
28460 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
28470 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
28480 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
28490 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
284a0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
284b0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
284c0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
284d0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
284e0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
284f0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
28500 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
28510 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
28520 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
28530 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
28540 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
28550 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
28560 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
28570 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
28580 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
28590 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
285a0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
285b0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
285c0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
285d0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
285e0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
285f0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
28600 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
28610 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
28620 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
28630 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  ).  static sqlit
28640 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61  e3_vfs winLongPa
28650 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  thVfs = {.    3,
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
28680 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
28690 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a  File),     /* sz
286a0 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
286b0 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
286c0 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
286d0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
286e0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
286f0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
28700 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67  .    "win32-long
28710 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61  path",    /* zNa
28720 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28740 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
28750 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
28760 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
28770 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
28780 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
28790 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
287a0 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
287b0 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
287c0 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
287d0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
287e0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
287f0 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
28800 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
28810 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
28820 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
28830 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
28840 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
28850 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
28860 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
28870 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
28880 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
28890 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
288a0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
288b0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
288c0 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
288d0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
288e0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
288f0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
28900 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
28910 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
28920 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
28930 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
28940 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
28950 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
28960 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
28970 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
28980 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
28990 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
289a0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
289b0 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
289c0 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
289d0 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
289e0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
289f0 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  .  };.#endif..  
28a00 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20  /* Double-check 
28a10 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c  that the aSyscal
28a20 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65  l[] array has be
28a30 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  en constructed. 
28a40 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20   ** correctly.  
28a50 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61  See ticket [bb3a
28a60 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a  86e890c8e96ab] *
28a70 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  /.  assert( Arra
28a80 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d  ySize(aSyscall)=
28a90 3d 37 35 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74  =75 );..  /* get
28aa0 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
28ab0 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
28ac0 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
28ad0 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
28ae0 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
28af0 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
28b00 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
28b10 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
28b20 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
28b30 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
28b40 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
28b50 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
28b60 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
28b70 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
28b80 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20  nularity>0 );.  
28b90 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
28ba0 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20  fo.dwPageSize>0 
28bb0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  );..  sqlite3_vf
28bc0 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56  s_register(&winV
28bd0 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66  fs, 1);..#if def
28be0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
28bf0 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71  2_HAS_WIDE).  sq
28c00 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
28c10 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56  er(&winLongPathV
28c20 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  fs, 0);.#endif..
28c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28c40 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  OK; .}..int sqli
28c50 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
28c60 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  { .#if SQLITE_OS
28c70 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65  _WINRT.  if( sle
28c80 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj!=NULL ){. 
28c90 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
28ca0 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20  (sleepObj);.    
28cb0 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
28cc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
28cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28ce0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
28cf0 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a        ITE_OS_WIN */.